SQL -Auswahlklausel mit einer Verbindung
-
26-10-2019 - |
Frage
Ich habe zwei Such-/Referenztabellen (abonniert und unübertroffen) in meiner Microsoft SQL Server 2008 -Datenbank 2008 mit der folgenden Struktur:
UserId int
PublicationId int
Diese Felder werden zusammen als zusammengesetzten Index indiziert.
Ich möchte in der Lage sein, alle Datensätze zu finden, die in der nicht subikierten Tabelle vorhanden sind, die in der abonnierten Tabelle keinen Übereinstimmungsdatensatz haben (passender UserID und PublicationID).
Funktionell möchte ich so etwas wie:
select PublicationId, UserId
from Unsubscribed
where PublicationId, UserId not in (
select PublicationId, UserId
from Subscribed
)
Kann mir jemand in die richtige Richtung verweisen?
Vielen Dank.
Lösung
SELECT PublicationId, UserId
FROM Unsubscribed
MINUS
SELECT PublicationId, UserId
FROM Subscribed
Andere Tipps
Sie können a verwenden left join
Um die nicht passenden Veröffentlichungen und Benutzer zu finden.
SELECT U.[PublicationId], U.[UserId]
FROM [Unsubscribed] AS U
LEFT JOIN [Subscribed] AS S ON S.[PublicationId] = U.[PublicationId]
AND S.[UserId] = U.[UserId]
WHERE S.[PublicationId] IS NULL
AND S.[UserId] IS NULL
Oder wenn Sie Microsoft SQL Server 2005/8 2008 verwenden, können Sie die verwenden Except
Schlüsselwort (Verwenden Sie die Intersect
Schlüsselwort für das Gegenteil).
SELECT [PublicationId], [UserId]
FROM [Unsubscribed]
EXCEPT
SELECT [PublicationId], [UserId]
FROM [Subscribed]
Sie können jederzeit konvertieren IN
zu EXISTS
. In Ihrem Fall würde dies so aussehen:
select PublicationId, UserId
from Unsubscribed
where
not exists (
select *
from Subscribed
where Subscribed.PublicationId = Unsubscribed.PublicationId
and Subscribed.UserId = Unsubscribed.UserId
)
Wenn Sie Oracle verwenden, können Sie übrigens Ihre ursprüngliche Absicht direkt implementieren (fügen Sie einfach ein paar Klammern hinzu):
select PublicationId, UserId
from Unsubscribed
where (PublicationId, UserId) not in (
select PublicationId, UserId
from Subscribed
)
Sie können a verwenden Links Join um das zu erreichen;
SELECT U.*, S.PublicationId
FROM Unsubscribed U
LEFT JOIN Subscribed S ON U.PublicationId = S.PublicationId AND U.UserId = S.UserId
WHERE S.PublicationId IS NULL
Wenn Sie neu sind, beitreten, Jeff Atwoods visuelle Erklärung ist ein guter Ausgangspunkt.
Tatsächlich bringt die Abfrage alle Zeilen in UBSUBSBICED zurück, die eine passende Zeile in Abonnement enthalten, und alle Zeilen in nicht subizierten, die keine übereinstimmenden Zeilen in abonnierten Zeilen enthalten - die abonnierten Zeilen sind mit Null für diese dargestellt.