Sql mehrere joins auf dieselbe Tabelle sowohl inklusiv und exklusiv

Ich habe eine Tabelle Foo

FOO
-------
id
name

BAR
-------
id
name

FOO_BAR_XREF
-------
foo_id
bar_id

Brauche ich, um wählen Sie alle Instanzen von FOO, wo foo.id hat einen Eintrag in foo_bar_xref mit einem bar_id 1 Datensätze aus foo, wo foo.id eines Datensatzes n foo_bar_xref mit einem bar_id 2

foo -> foo_bar_xref ist einer von vielen *emphasized text*foo_bar_xref enthält möglicherweise mehrere bar_id pro foo_id

Ist das möglich, nur mit Verknüpfungen oder brauche ich für die Nutzung nicht vorhanden ist, statements in der where-Klausel?

bisher habe ich

select f.name from FOO f
inner join FOO_BAR_XREF fb_1 on fb_1.foo_id = f.id
inner join FOO_BAR_XREF fb_2 on fb_2.foo_id = f.id

where fb_1.bar_id = 1 and fb_2.bar_id <> 2
group by f.name -- remove dupes - running on sql server and is paged with sql servers hackish over keyword where distinct doesn't work so well.

das ist nicht das herausfiltern der foo ' s, die haben eine Leiste von 2

DIESER scheint zu arbeiten, aber ich bin nicht sicher, es ist die effizienteste

select f.name from FOO f
inner join FOO_BAR_XREF fb_1 on fb_1.foo_id = f.id and fb_1.bar_id = 1
left outer join FOO_BAR_XREF fb_2 on fb_2.foo_id = f.id and fb_2.bar_id = 2

where fb_2.bar_id is null
group by f.name -- remove dupes
  • Ich mag dein left join-Ansatz-meine Gedanken auch.
InformationsquelleAutor dstarh | 2013-01-14
Schreibe einen Kommentar