2011-12-07 8 views
5

Tengo 2 tablas:SQL unirse a la que me dice que si Identificación existe en otra mesa

A  B 
-- ---- 
ID FKID 
-- ---- 
1  3 
2  3 
3  4 
4  4 

que necesito una instrucción de selección que me muestra todas las respuestas con un campo que me dice que si la tabla B tiene ningún código que empareja esa identificación.

Desired Result 
----------- 
ID | hasB 
----------- 
1 no 
2 no  
3 yes 
4 yes 
+0

uso combinación externa y NVL – Randy

+0

qué sabor de SQL? –

+0

Estoy usando postgis – capdragon

Respuesta

10

En SQL Server Esta sería la forma más eficiente en lugar de hacer una OUTER JOIN luego eliminar los duplicados con DISTINCT. No estoy seguro para Postgres, necesitaría verificar los planes.

SELECT ID, 
     CASE 
     WHEN EXISTS (SELECT * 
         FROM B 
         WHERE B.FKID = A.ID) THEN 'yes' 
     ELSE 'no' 
     END AS hasB 
FROM A 
+3

+1: estoy de acuerdo en que * es probable * que se evite una carga innecesaria en el servidor al evitar la necesidad de GROUP BY, DISTINCT y no tener que procesar todas las filas duplicadas en la tablaB. – MatBailie

+1

@Dems: traes un "valor agregado" increíble a esta comunidad al ayudar a una persona a tomar una decisión. Sus comentarios son muy apreciados. (+1) para los dos. – capdragon

+0

@capdragon: También puedo ser un dolor en el trasero, pero igualmente te agradezco :) – MatBailie

2
SELECT DISTINCT 
    a.ID, 
    CASE WHEN b.FKID IS NULL THEN 'no' ELSE 'yes' END AS hasB 
FROM 
    tableA a LEFT JOIN 
    tableB b ON a.ID = b.FKID 
+1

1: muchas relaciones causarán duplicados en la salida. (¿Usar GROUP BY también, o EXISTS en su lugar?) – MatBailie

+0

Buen punto ... actualizado. –

+0

+1 por ser el primero en publicar. – capdragon

1

Algo como esto debería funcionar para usted en función de lo que la plataforma de base de datos que realmente es. Es posible que deba cambiar la carcasa por una IIF en algo hermoso como MS Access.

select A.ID, case when B.FKID IS NULL then 'no' else 'yes' end as hasB from A left join B on A.ID = B.FKID 
+0

Esta preferida ya que es legible – Oybek

+3

1: muchas relaciones causarán duplicados en la salida. (¿Usar GROUP BY también, o EXISTS en su lugar?) [@Oybek - el formulario EXISTS debe ser legible para cualquier usuario SQL capaz, y como esto causa resultados duplicados, es incorrecto o incompleto.] – MatBailie

+0

Yo diría que ' Es incorrecto con seguridad: peligros de no leer la pregunta completamente antes de escribir. Me habría ido con los EXISTE si hubiese notado la naturaleza de las tablas de uno a muchos. –

0

SELECT ID, "no" como hasB de una en las que no (id en (seleccione fkid de b))

unión

SELECT ID, "sí", como hasB de un id donde en (seleccione fkid de b)

+3

Escaneará ambas tablas dos veces, puede formarse sin necesidad de duplicar los escaneos. – MatBailie

+0

En general, puede ser mejor que una unión dependiendo de los índices establecidos en la tabla y las dimensiones de las tablas. –

0

Usando la siguiente consulta

SELECT DISTINCT ID,IF(FKID,'yes','no') AS hasB 
FROM A LEFT JOIN B ON A.ID = B.FKID; 

Usted obtendrá

+------+------+ 
| ID | hasB | 
+------+------+ 
| 1 | no | 
| 2 | no | 
| 3 | yes | 
| 4 | yes | 
+------+------+ 
4 rows in set (0.07 sec) 
0

Cualquiera de estos debe hacer: select distinct a.id,(case when b.fkid is null then 0 else 1 end) as hasb from tablea a left join tableb b on a.id=b.fkid

select a.id,(case when exists(select * from tableb where a.id=fkid) then 1 else 0 end) as hasb from tablea a

Cuestiones relacionadas