2017-06-15 2 views
0

Ich arbeite in SQL Server 2016. Ich habe 2 Tabellen - A und B. Eine Probe von ihnen ist wie folgt:SQL Server-Abfrage zu finden Reihen von Gruppen fehlt

A: 
Product Day   Job 
x   2017-06-15 1 
x   2017-06-15 2 
x   2017-06-15 3 
x   2017-06-14 1 
x   2017-06-14 2 
y   2017-06-15 1 
y   2017-06-14 1 
y   2017-06-14 2 

B: 
Product  Job 
x    1 
x    2 
x    3 
y    1 
y    2 

möchte ich zeigen die Produkte und Tage in Tabelle A fehlen Job-Instanzen, wie also von Tabelle B definiert, zum Beispiel, ich will zurückkehren:

Product  Day   Job 
x    2017-06-14 3 
y    2017-06-15 2 

ich mit, herauszufinden, die Abfrage bin zu kämpfen. Ich kann keine gerade FROM A RIGHT JOIN B ON B.Product = A.Product AND B.Job = A.Job WHERE A.Job IS NULL tun, da das unabhängig von Day ist. Es ist fast so, als müsste ich Tisch A tagsüber zerhacken und ihn mehrmals gegen Tisch B stellen (einmal für jeden Tag), aber es ist wahrscheinlich eine schlechte Idee, sich mehrere Male anzuschließen. Wie kann ich die gewünschte Leistung erreichen?

Antwort

1

Sie müssen eine Liste aller möglichen Daten als weiteres Join-Prädikat verwenden. In diesem Beispiel habe ich eine Cte ​​aller Daten erstellt. Dann können Sie alle Jobs für alle Termine auflisten. Von dort ist es ein einfacher linker Join zu einem für die fehlenden Werte.

Beachten Sie, wie ich Tabellen erstellt und sie mit Beispieldaten gefüllt habe. So sollten Sie Ihre Beispieldaten in Zukunft veröffentlichen. Macht es viel einfacher für diejenigen, die versuchen zu helfen. :)

DECLARE @a TABLE 
(
    Product CHAR(1) 
    , JobDay DATE 
    , Job TINYINT 
) 

INSERT @a 
(
    Product, 
    JobDay, 
    Job 
) 
VALUES 
('x', '2017-06-15', 1) 
,('x', '2017-06-15', 2) 
,('x', '2017-06-15', 3) 
,('x', '2017-06-14', 1) 
,('x', '2017-06-14', 2) 
,('y', '2017-06-15', 1) 
,('y', '2017-06-14', 1) 
,('y', '2017-06-14', 2) 

DECLARE @b TABLE 
(
    Product CHAR(1) 
    , Job tinyint 
) 

INSERT @b 
(
    Product, 
    Job 
) 
VALUES 
('x', 1) 
,('x', 2) 
,('x', 3) 
,('y', 1) 
,('y', 2) 
; 

WITH AllDates AS 
(
    SELECT DISTINCT JobDay 
    FROM @a 
) 

SELECT b.Product 
    , ad.JobDay 
    , b.Job 
FROM @b b 
CROSS JOIN AllDates ad 
LEFT JOIN @a a ON a.Product = b.Product 
    AND a.Job = b.Job 
    AND a.JobDay = ad.JobDay 
WHERE a.Job IS NULL 
; 
+0

Danke! Ja, ich werde sicher sein, SQL-Syntax für die Erstellung von Beispieldaten in der Zukunft zu liefern. – user3100444