2017-03-14 3 views
1

Ich habe eine schwierige Frage. I haben zwei Sätze auf TabellenWählen Sie Datensätze aus, in denen Felder in t1 nicht in t2 existieren, aber ignorieren, wenn t1 Felder NULL sind

Tabelle 1:

VoucherCode | Category | Size | Colour | Gender 
0001  | Shirt  | NULL | Green | Male 
0002  | Shirt  | 12 | NULL | Male 
0003  | Shirt  | 12 | Blue | NULL 
0004  | Shirt  | NULL | NULL | NULL 
0005  | Shorts | NULL | Brown | Male 
0006  | Shorts | 10 | NULL | Male 
0007  | Shorts | 12 | Green | NULL 
0008  | Shorts | NULL | NULL | NULL 
0009  | Pants  | NULL | Pink | Female 
0010  | Pants  | 10 | NULL | Male 
0011  | Pants  | 12 | Purple | NULL 
0012  | Pants  | NULL | NULL | NULL 

Tabelle 2:

ProductCode | Category | Size | Colour | Gender 
0001  | Shirt  | 10 | Blue | Male 
0002  | Shorts | 13 | Brown | Female 
0003  | Pants  | 10 | Purple | Male 
0004  | Pants  | 10 | Purple | Female 

Die erste Tabelle ist eine Liste Gutscheinen, die zweite Tabelle ist eine Liste von Produkten. Ich muss eine Abfrage schreiben, die eine Liste von Gutscheinen zurückgibt, die unmöglich funktionieren könnte.

Die Prämisse, bestimmte Attribute eines Gutscheins können anstelle eines Literals NULL sein, weil die beabsichtigte Verwendung dieses Gutscheins für eine beliebige Kombination der anderen definierten Attribute ist.

Beispiele:

den Gutscheincode 0001 konnte nicht Arbeit, weil es keine Produkte mit einer Kategorie von Hemd, Farbe Grün, und Geschlecht von männlich

den Gutscheincode 0004 konnte Arbeit, weil es ist ein Produkt mit einer Kategorie von Shirt.

Um dies zu berücksichtigen, muss ich eine Abfrage schreiben, um alle Datensätze aus Tabelle 1 zurückzugeben, die möglicherweise nicht funktionieren könnten.

Ergebnisse wie diese

VoucherCode | Category | Size | Colour | Gender 
0001  | Shirt  | NULL | Green | Male 
0002  | Shirt  | 12 | NULL | Male 
0003  | Shirt  | 12 | Blue | NULL 
0005  | Shorts | NULL | Brown | Male 
0006  | Shorts | 10 | NULL | Male 
0007  | Shorts | 12 | Green | NULL 
0009  | Pants  | NULL | Pink | Female 
0011  | Pants  | 12 | Purple | NULL 

Hat jemand irgendwelche Ideen zu sehen, wie ich das erreichen könnte?

+0

Tag deine Frage mit der Datenbank du benutzt. –

+0

Notieren Sie die Regeln, Prädikate oder Ausdrücke, die jeder Gutschein erfüllen muss, um in die Ausgabe aufgenommen zu werden. Beispiele sind hilfreich, aber die Regeln müssen zuerst definiert werden. –

+0

Ihre Beschreibung ist * fast * perfekt. Aber Sie scheinen vergessen zu haben, die Gutscheine 3,4 und 8 in Ihrer Tabelle t1 aufzulisten. Sie erscheinen nur in Ihrer Lösung. – cars10m

Antwort

1

Eine Möglichkeit, es zu tun, ist null mit Join linken Seite.

erstellen und füllen Beispieltabellen (Bitte speichern uns dieser Schritt in Ihrer zukünftigen Fragen)

DECLARE @Voucher as TABLE 
(
    VoucherCode char(4), 
    Category varchar(10), 
    Size int, 
    Colour varchar(10), 
    Gender varchar(6)  
) 

INSERT INTO @Voucher VALUES 

('0001', 'Shirt', NULL, 'Green', 'Male'), 
('0002', 'Shirt', 12 , NULL, 'Male'), 
('0003', 'Shirt', 12 , 'Blue', NULL), 
('0004', 'Shirt', NULL, NULL, NULL), 
('0005', 'Shorts', NULL, 'Brown', 'Male'), 
('0006', 'Shorts', 10 , NULL, 'Male'), 
('0007', 'Shorts', 12 , 'Green', NULL), 
('0008', 'Shorts', NULL, NULL, NULL), 
('0009', 'Pants', NULL, 'Pink', 'Female'), 
('0010', 'Pants', 10 , NULL, 'Male'), 
('0011', 'Pants', 12 , 'Purple', NULL), 
('0012', 'Pants', NULL, NULL, NULL) 


DECLARE @Product as TABLE 
(
    ProductCode char(4), 
    Category varchar(10), 
    Size int, 
    Colour varchar(10), 
    Gender varchar(6)  
) 

INSERT INTO @Product VALUES 
('0001', 'Shirt', 10, 'Blue', 'Male'), 
('0002', 'Shorts', 13, 'Brown', 'Female'), 
('0003', 'Pants', 10, 'Purple', 'Male'), 
('0004', 'Pants', 10, 'Purple', 'Female') 

Die Abfrage:

SELECT V.VoucherCode, 
     V.Category, 
     V.Size, 
     V.Colour, 
     V.Gender 
FROM @Voucher V 
LEFT JOIN @Product P 
ON V.Category = P.Category 
AND ISNULL(V.Size, P.Size) = P.Size 
AND ISNULL(V.Colour, P.Colour) = P.Colour 
AND ISNULL(V.Gender, P.Gender) = P.Gender 
WHERE P.ProductCode IS NULL 

Ergebnisse:

VoucherCode Category Size Colour Gender 
0001  Shirt  NULL Green Male 
0002  Shirt  12  NULL Male 
0003  Shirt  12  Blue NULL 
0005  Shorts  NULL Brown Male 
0006  Shorts  10  NULL Male 
0007  Shorts  12  Green NULL 
0009  Pants  NULL Pink Female 
0011  Pants  12  Purple NULL 
+0

Ich war eigentlich gerade dabei anzufangen genau zu tippen, was du gerade getan hast ... ich werde das in Zukunft tun ... Das ist großartig :) Vielen Dank !!! –

0

Ich denke, das eine Lösung Ihr Ergebnis bekommen könnte (aber ich habe es nicht getestet)

SELECT v.* 
FROM Vouchers AS v 
    LEFT OUTER JOIN Products AS p 
    ON v.Category = p.category AND 
     ISNULL(v.Size, -1) = ISNULL(p.Size, -1) AND 
     ISNULL(v.Colour, '-1') = ISNULL(p.Colour, '-1') AND 
     ISNULL(v.Gender, '-1') = ISNULL(p.Gender, '-1') 
WHERE p.ProductCode IS NULL 
+0

Nach der Freigabe von Beispieldaten funktioniert dieses Codebeispiel nicht. – Kevin

Verwandte Themen