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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wiederholen, mein Kommentar, ich glaube, OP hat die beste Lösung. Ich habe immer bevorzugt mit der linken schließt sich für diese Szenarien.
Und die SQL Fiddle.
BTW, ich denke, das ist die effizienteste Lösung in Bezug auf die Tabelle durchsucht. Überprüfen Sie Ihre Ausführungspläne und sehen, was Sie haben zu gehen auf.
Da Sie mithilfe von SQL Server verwenden, können Sie die
EXCEPT
set-operation zu tun, so wie diese:Im folgenden wird ein Weg, dies zu tun. Es fasst die xref-Tabelle, um die foo ' s mit bar=1, aber nicht bar=2. Ich ziehe mit aggregation für diese Art von Abfrage, im Allgemeinen.
Hinweis: das SQL ist nicht getestet, es kann also syntax-Fehler.