2017-06-15 75 views
0

我在SQL Server的工作缺少的行2016年我有2個表 - A和B.他們的樣本如下:SQL Server查詢來查找組

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 

我想表明這產品與天表A缺少工作的情況下,如表B定義,因此,例如,我想回:

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

我首先要弄清楚查詢掙扎。我不能直接做FROM A RIGHT JOIN B ON B.Product = A.Product AND B.Job = A.Job WHERE A.Job IS NULL,因爲它獨立於Day。這就好像我需要每天砍掉表A並且多次與表B一起加入(每天一次),但多次加入可能是一個壞主意。我怎樣才能達到我想要的輸出?

回答

1

您需要使用所有可能日期的列表作爲另一個連接謂詞。在這個例子中,我創建了所有日期的cte。然後,您可以列出所有日期的所有工作清單。從那裏它是一個簡單的左連接到缺少的值。

請注意我是如何創建表格並用樣本數據填充它們的。這是您將來如何發佈樣本數據的方式。使那些試圖幫助的人變得更容易。 :)

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

謝謝!是的,我將確保將來爲示例數據創建提供SQL語法。 – user3100444