2017-10-24 25 views
0

Ich habe ein einfaches Datenbankschema von 3 TabellenUnion-Abfrage verwandelt Abfrage

Benutzer
id
Name
matricule

Dokument
id
serielle
zusammengesetzt beitreten user_id (Besitzer des Dokuments: Fremdschlüssel für Benutzer (id))

User_Document (Join-Tabelle)
user_id

DOCUMENT_ID

Ich möchte alle Dokumente Serien von beiden Benutzerquellen: Inhaber des Dokuments und Join-Tabelle. Die Abfrage wird durch eine Liste des Benutzers gefiltert Häftling

ich das gewünschte Ziel mit Union-Abfrage zu erreichen verwaltet:

select d.serial from Document d 
INNER JOIN users u ON u.id = d.user_id 
where u.matricule IN ('1234') 
UNION 
select d.serial from Document d 
inner join User_Document ud on d.id = ud.document_id 
inner join users u on ud.user_id = u.id 
where u.matricule IN ('1234') 

Wie mit nur einer Join-Abfrage zu dem gleichen Ergebnis kommen? Ich brauche überspringen und Dokument ohne serielle (dieser Fall möglich ist)

Vielen Dank

Antwort

1

Try this:

SELECT d.serial 
FROM Document d 
    LEFT JOIN User_Document ud 
     ON d.id = ud.document_id 
    LEFT JOIN users u 
     on ud.user_id = u.id 
    LEFT JOIN users u2 
     ON d.user_id = u2.id 
WHERE d.serial IS NOT NULL 
AND 
(
    ISNULL(u.matricule,'') IN ('1234') 
    OR ISNULL(u2.matricule,'') IN ('1234') 
) 
+0

Danke, es funktioniert gut! – ulquiorra

+0

Interessant. Diese Abfrage kann Duplikate zurückgeben, wie es jetzt geschrieben ist, während Ihre Version dies nicht tut. –

1

Warum wollen Sie das join s entfernen? Wahrscheinlich die effizienteste Abfrage exists verwenden würde:

select d.* 
from documents d 
where d.serial is not null and 
     (exists (select 1 
       from users u 
       where u.id = d.user_id and u.matricule = '1234' 
      ) or 
     exists (select 1 
       from user_document ud join 
        users u 
        on u.id = d.user_id 
       where ud.document_id = d.id and u.matricule = '1234' 
      ) 
    ); 

Dazu würden Sie dann wollen Indizes auf users(id, matricule), user_documents(document_id, user_id) und documents(serial, user_id, document_id).

Die Verwendung von Indizes spart die Eliminierung von Duplikaten - was ein großer Gewinn für diese Art von Abfrage sein sollte.

+0

Ich möchte nicht entfernen, sondern Union. Du hast Recht, ich brauche einige Indizes, wenn die Tabelle wächst. Ihre Abfrage funktioniert auch gut. Vielen Dank – ulquiorra

Verwandte Themen