2016-11-27 11 views
0

Ich bin in Kreisen mit Join und EXISTS und ISNULL gegangen. Ich kann das nicht herausfinden und ich habe Hunderte von Threads durchlaufen.Vergleichen Sie Daten in einer Tabelle mit einer anderen Tabelle

Datensätze in Tabelle Seiten treibt die Ausgabe von einzelnen Einzelhandel Webseiten. Die Felder in dieser Tabelle bestimmen, welche Elemente angezeigt:

  • PageID INT
  • Kategorie VARCHAR (30)
  • Farbe VARCHAR (10)
  • Größe VARCHAR (10)
  • OnSale BIT

z

  • PageID = 201
  • Kategorie = Schuhe
  • Farbe = Rot
  • Size = Large
  • OnSale = 1

ich diese Felder gegen namensgleichen Felder vergleichen müssen in Accounts_Emails.

  • fk_AccountID INT
  • Kategorie VARCHAR (30)
  • Farbe VARCHAR (10)
  • Größe VARCHAR (10)
  • OnSale BIT

Diese Tabelle ermöglicht es Benutzern, Optionen zu speichern für E-Mail-Newsletter. Wenn sie mehr Elemente senden möchten, die denen auf der aktuellen Seite ähneln, klicken sie auf eine Schaltfläche auf dieser Seite.

Was ich brauche, ist eine gespeicherte Prozedur, die überprüft, ob dieser Benutzer bereits die genaue Übereinstimmung der Optionen in einem Accounts_Emails-Datensatz hat, und wenn nicht einen neuen Datensatz mit diesen Optionen einfügen.

In den Feldern bedeutet ein NULL-Wert ALL, also muss ich Nullen vergleichen. Ich gebe die PageID und die AccountID an die Prozedur weiter, damit ich den aktuellen Pages-Datensatz aufnehmen und die Accounts_Emails auf den aktuellen Benutzer beschränken kann. Diese

ist, was ich habe:

IF NOT EXISTS 
(

SELECT 1 FROM Accounts_Emails a 
JOIN Pages l on l.PageID = @PageID 
WHERE 
a.fk_AccountID = @AccountID AND 
(ISNULL(a.Category,'NULL') = ISNULL(l.Category,'NULL')) AND 
(ISNULL(a.Colour,'NULL') = ISNULL(l.Colour,'NULL')) AND 
(ISNULL(a.Size,'NULL') = ISNULL(l.Size,'NULL')) AND 
(ISNULL(a.OnSale,'NULL') = ISNULL(l.OnSale,'NULL')) 

) 
+0

Ich denke, es wäre besser und einfacher, nur die Seiten-ID zu speichern. Ich meine, Sie haben bereits die Daten in der Seitentabelle gespeichert, warum sollten Sie die gleichen Daten zweimal speichern? –

+0

Prädikatsausdrücke 'a' und' b' sind gleich oder beides NULL: 'ISNULL (NULLIF (a, b), NULLIF (b, a)) IST NULL' – Serg

+0

Würdest du das bitte in mein Beispiel oben einfügen können , also kann ich sehen, wie es in der Praxis funktioniert? – TVRV8S

Antwort

0

es sieht aus wie Sie eine MERGE-Anweisung verwenden müssen. Verwenden von Accounts_Emails als TARGET.

Viele gute Beispiele sind online.

Verwandte Themen