2011-05-12 11 views
9

Pude haber hecho lo que deseo con dos solicitudes, pero quiero hacerlo con una sola.Unión interna solo si un campo no está vacío

De hecho, tengo 4 mesas con:

Table 1 : id, sub-id 
Table 2 : id, sub-id 
Table 3 : id, login 
Table 4 : id, login 

hago una petición como esa:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
    Table3.login, Table4.login FROM Table1 
    INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id) 
    INNER JOIN Table3 ON (Table3.id = Table1.id) 
    INNER JOIN Table4 ON (Table4.id = Table1.id) 
    WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid" 

que quieren unirse Table3 sólo si id no está vacío, si está vacía , Me uno al Table4.

¿Tiene alguna idea, por favor?

He oído que una combinación de la izquierda podría ayudar, pero no estoy tan acostumbrado a estas palabras clave así que ...?

+0

Si puede garantizar que los id de la Tabla 3 y la Tabla 4 no serán iguales, entonces la consulta anterior estaría bien. De lo contrario, tendrías que buscar la ruta SQL dinámica, creo. – anothershrubery

+0

[Explicación visual de las uniones SQL] (http://www.codinghorror.com/blog/archives/000976.html) –

Respuesta

7

Como se dijo en las otras respuestas, puede usar una combinación de la izquierda. También puede agregar case statement tener sólo una login columna:

SELECT 
    Table1.id, 
    Table1.sub-id, 
    Table2.id, 
    Table2.sub-id, 
    CASE 
     WHEN Table3.id IS NOT NULL THEN Table3.login 
     ELSE Table4.login 
    END CASE AS login 
FROM Table1 
INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id) 
LEFT JOIN Table3 ON (Table3.id = Table1.id) 
LEFT JOIN Table4 ON (Table4.id = Table1.id) 
WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid" 
+2

'COALESCE (Table3.login, Table4.login)' da exactamente el mismo resultado con su 'CASE ... END CASE'. –

+0

@ycubcube en este caso preciso, podemos suponer que sí, pero dado que la condición está en la columna 'id' y queremos la columna' login', no es exactamente equivalente, hay algunos casos donde los resultados no serán los mismo. – krtek

2

Esto podría ayudar:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
    Table3.login, Table4.login FROM Table1 
    INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id) 
    LEFT JOIN Table3 ON (Table3.id = Table1.id) 
    LEFT JOIN Table4 ON (Table4.id = Table1.id) 
    WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid" 
+0

De hecho, ayudó :) – Sumz

4

uso a la izquierda de Ingreso:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
Table3.login, Table4.login FROM Table1 
INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id) 
LEFT JOIN Table3 ON (Table3.id = Table1.id) 
LEFT JOIN Table4 ON (Table4.id = Table1.id) 
WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid" 

A continuación, las filas de Tabla 3 y Tabla 4 se unirán si existe una coincidencia. De lo contrario, estos serán NULL. A continuación, puede verificar los resultados y utilizar los datos de Table3, si está presente, o Table4 de lo contrario.

2

intentar algo como esto:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
    COALESCE(Table3.login, Table4.login) AS login 
FROM Table1 
INNER JOIN Table2 ON Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id 
LEFT JOIN Table3 ON Table3.id = Table1.id 
LEFT JOIN Table4 ON Table4.id = Table1.id 
WHERE Table1.id = 'my_id' AND Table1.sub-id = 'my_subid' 

he retirado parethensis innecesario para reducir el desorden. Además, tenga en cuenta que el delimitador de cadena estándar en SQL es la comilla simple.

+0

Ah, escribir más rápido. –

+0

@ycubcube - No es habitual en mí :) –

2

Si, por cualquier table1.id, o bien sólotable3.ido únicamentetable4.id coincidirá, puede utilizar esto:

SELECT 
    Table1.id 
    , Table1.sub-id 
    , Table2.id 
    , Table2.sub-id 
    , COALESCE(Table3.login, Table4.login) 
    AS login 

FROM Table1 
    INNER JOIN 
    Table2 ON (Table1.id = Table2.id 
      AND Table1.sub-id = Table2.sub-id) 
    LEFT JOIN 
    Table3 ON (Table3.id = Table1.id) 
    LEFT JOIN 
    Table4 ON (Table4.id = Table1.id) 

WHERE Table1.id = "my_id" 
    AND Table1.sub-id = "my_subid" 
+0

Gracias :) que funcionó – Sumz

+0

@LostInJoin: Puede aceptar la respuesta de Alvaro. Es lo mismo que el mío y él publicó primero. –

Cuestiones relacionadas