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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top