2017-03-16 18 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_detail列でNULLについて心配していないが、これはテストユーザーであります。

数百人のユーザーに対してこのクエリを繰り返し、見つからないエントリを見つける必要があります。例えば、上記の人がand td.sid_member = 2071収率のみ一致する行を削除detailType 3、16、33、34、58

--EDIT--

が欠落しています。この場合、sid_member 2071の結果は、detailTypeが発生しない行を除外します。何の結果

+0

ごとに、あなたの非マッチを与えるだろう。 IDと詳細タイプのマスターリストが必要です。その後、そのリストに結合を残して、各固有IDごとに欠落している詳細タイプを見つけることができます。 – abraxascarab

答えて

0

は、既存のクエリでこの行を削除していないか、交換where td.sid_member is nullリターン追加

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 

これは基本的にすべての不一致を提供します。

* EDIT *

[OK]をあなたが私達にあなたのテーブル構造を与えていないので、...、私はいくつかのより多くの本について考え...

あなたは行方不明と一緒にあなたの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

関連する問題