2017-03-16 60 views
0

我有一系列名單信息的詳細信息。重複匹配一組詳細信息類型與多個行

我有一張名單詳細信息表。每個人都有一個ID#,並且該ID#有大約50行的詳細信息。 PK是ID#,詳細類型和日期。

我想加入名單詳細信息表中的每一行的子查詢的結果,以找到人們缺少什麼細節類型。

我能達到的結果我想有個人:

select * 
from (

    -- a big sub-query yielding 39 lines of the detail types I want 

) list_of_details 
left join textDetail td 
    on td.detailType = list_of_details.detailType 
    and td.sid_member = 2071 
order by dt.sid_detailType 

產量:

detailType  ID   detailType  date_start    value_detail 
-------------- ----------- -------------- --------------------------------- 
1    2071  1    2017-03-14 00:00:00.000 test 
1    2071  1    2017-03-14 16:58:50.037 NULL 
2    2071  2    2017-03-14 00:00:00.000 test 
2    2071  2    2017-03-14 16:58:50.037 NULL 
3    NULL  NULL   NULL     NULL 
4    2071  4    2017-03-14 16:58:50.037 NULL 
16    NULL  NULL   NULL     NULL 
17    2071  17    2017-03-14 16:58:50.037 NULL 
18    2071  18    2017-03-14 16:58:50.037 NULL 
19    2071  19    2017-03-14 16:58:50.037 NULL 
20    2071  20    2017-03-14 16:58:50.037 NULL 
21    2071  21    2017-03-14 16:58:50.037 NULL 
22    2071  22    2017-03-14 16:58:50.037 NULL 
23    2071  23    2017-03-14 16:58:50.037 NULL 
24    2071  24    2017-03-14 16:58:50.037 NULL 
25    2071  25    2017-03-14 16:58:50.037 NULL 
27    2071  27    2017-03-14 16:58:50.037 NULL 
28    2071  28    2017-03-14 16:58:50.037 NULL 
33    NULL  NULL   NULL     NULL 
34    NULL  NULL   NULL     NULL 
35    2071  35    2017-03-14 16:58:50.037 NULL 
36    2071  36    2017-03-14 16:58:50.037 NULL 
37    2071  37    2017-03-14 16:58:50.037 NULL 
38    2071  38    2017-03-14 16:58:50.037 NULL 
39    2071  39    2017-03-14 16:58:50.037 NULL 
40    2071  40    2017-03-14 16:58:50.037 NULL 
41    2071  41    2017-03-14 16:58:50.037 NULL 
42    2071  42    2017-03-14 16:58:50.037 NULL 
46    2071  46    2017-03-14 16:58:50.037 NULL 
47    2071  47    2017-03-14 16:58:50.037 NULL 
48    2071  48    2017-03-14 16:58:50.037 NULL 
51    2071  51    2017-03-14 16:58:50.037 NULL 
52    2071  52    2017-03-14 16:58:50.037 NULL 
53    2071  53    2017-03-14 16:58:50.037 NULL 
54    2071  54    2017-03-14 16:58:50.037 NULL 
55    2071  55    2017-03-14 16:58:50.037 NULL 
56    2071  56    2017-03-14 16:58:50.037 NULL 
57    2071  57    2017-03-14 16:58:50.037 NULL 
58    NULL  NULL   NULL     NULL 

我並不擔心在value_detailNULL,這是一個測試用戶。

我需要對幾百個用戶重複此查詢,並找出它們丟失的條目。例如上述人缺少detailType 3,16,33,34,58

- 編輯 -

卸下and td.sid_member = 2071收率只有匹配的行。在這種情況下,sid_member 2071的結果排除detailType不會發生的行,這正是我想要的。

添加where td.sid_member is null也不返回結果

+0

我做了一個更新我的回答如下。您需要一個ID和明細類型的主列表。然後,您可以將其加入該列表,以查找每個唯一ID的缺失細節類型。 – abraxascarab

回答

0

刪除或現有查詢替換此行:

and td.sid_member = 2071 
0

你幾乎沒有......你只需要在物聯網textDetail側檢查NULL :

left join textDetail td 
    on td.detailType = list_of_details.detailType 
WHERE td.sid_member IS NULL 
order by dt.sid_detailType 

這基本上給你所有的不匹配。

*編輯*

好吧......既然你沒有給我們你的表結構,我想過這個部分更多...

如果你希望你的ID與一起失蹤細節類型,您需要使用交叉連接創建包含所有可能的細節類型的ID的主列表。然後,您可以將其加入該主列表,併爲每個唯一ID獲取缺少的詳細信息類型。

SELECT xid.ID, xid.detailType 
FROM 
    (SELECT i.ID, d.detailType 
    FROM 
    (SELECT DISTINCT ID FROM textDetail) as i 
    cross join (SELECT DISTINCT detailType FROM list_of_details) as d 
    ) as xid 
left outer join textDetail td 
    on xid.ID = td.ID 
    AND xid.detailType = td.detailType 
WHERE td.detailType IS NULL 
ORDER BY xid.ID, xid.detailType 

現在,這會給你的非匹配每個ID