2011-12-07 7 views
5

Ho 2 tabelle:join SQL, che mi dice che se ID esiste in altra tabella

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

Ho bisogno di una dichiarazione prescelta che mi mostra tutti A con un campo che mi dice se la tabella B ha qualche ids che abbina quell'ID.

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

uso outer join e NVL – Randy

+0

che sapore di SQL? –

+0

Sto usando postgis – capdragon

risposta

10

In SQL Server questo sarebbe il modo più efficiente, piuttosto che fare un OUTER JOIN poi rimuovere i duplicati con DISTINCT. Non sono sicuro per postgres, avresti bisogno di controllare i piani.

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

+1: concorda che questo * è probabile * evitare il carico non necessario sul server evitando la necessità di GROUP BY, DISTINCT e non avendo bisogno di elaborare tutte le righe duplicate nella tabellaB. – MatBailie

+1

@Dems: porti un fantastico "valore aggiunto" a questa comunità aiutando una persona a prendere una decisione. I vostri commenti sono molto apprezzati. (+1) a tutti e due. – capdragon

+0

@capdragon: Posso anche essere un rompiscatole, ma ti ringrazio ugualmente :) – 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: molte relazioni causeranno duplicati nell'output. (Utilizzare anche GROUP BY o EXISTS?) – MatBailie

+0

Buon punto ... aggiornato. –

+0

+1 per essere il primo a postare. – capdragon

1

Qualcosa del genere dovrebbe funzionare per voi a seconda di ciò che la piattaforma di DB è in realtà. Potrebbe essere necessario scambiare il caso per un IIF su qualcosa di bello come 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

Questo preferito è leggibile – Oybek

+3

1: molte relazioni causano duplicati nell'output. (Utilizzare anche GROUP BY o EXISTS?) [@Oybek: il modulo EXISTS deve essere leggibile da qualsiasi utente SQL abilitato e, poiché ciò causa risultati duplicati, è errato o incompleto.] – MatBailie

+0

Direi che I ' m incerto di sicuro - pericoli di non aver letto completamente la domanda prima di digitare. Sarei andato con gli ESISTE se avessi notato quello per molti dei tavoli. –

0

SELECT MATR, "no" come hasB da una in cui non (id (selezionare fkid da b))

unione

SELECT MATR, "sì" come hasB da un dove id a (selezionare fkid da b)

+3

Esaminerà entrambi i tavoli due volte, può essere formato senza richiedere il doppio delle scansioni. – MatBailie

+0

In generale, può essere migliore di un join in base agli indici impostati sulla tabella e alle dimensioni delle tabelle. –

0

utilizzando la seguente query

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

otterrete

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

Uno di questi dovrebbe fare: 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

Problemi correlati