2016-08-07 14 views
1

我得到了一張表,其中包含用戶列表,用戶列表編號(1,2,3 ...)以及包含在該特定列表中的寶藏號。如何使用屬性找出表B中的所有記錄是否存在於表B中?

我得到另一個表「尋找」(Treasure和用戶之間的連接表),其中存儲了尋寶(F-FOUND,NF-未找到,NM-需要維護)字段的狀態是:User_name,Treasure_NO,狀態。

我試圖找到他們在表格中找到的所有寶物的人(寶藏_不是表格寶藏的fk)「尋找」 (找到的條件被定義爲F OR NM) 。 而且,他們有2名或以上不同列表(可以由每個用戶列表的數量被隔離)

我的代碼現在是這樣的:

SELECT LF.user_detail_Name 
      FROM(SELECT LC.user_name_detail AS NAME,LC.tressure_No AS T_NO,LC.num_Of_List_User AS LIST_NO 
       FROM dbo.tblListContains AS LC) AS LIST INNER JOIN dbo.tblLookingFor AS LF 
      ON LIST.NAME = LF.user_detail_Name 

      WHERE LIST.NAME NOT IN(SELECT LIST3.user_name_detail 
              FROM(SELECT LC.user_name_detail,LC.tressure_No 
              From dbo.tblListContains as LC 

               EXCEPT 

               SELECT LF.user_detail_Name,LF.tressure_No 
               FROM dbo.tblLookingFor AS LF)AS LIST3) 

      AND LIST.NAME IN (SELECT LIST4.user_name_detail 
          FROM(SELECT LC.user_name_detail,LC.tressure_No 
           From dbo.tblListContains as LC 

               INTERSECT 

               SELECT LF.user_detail_Name,LF.tressure_No 
               FROM dbo.tblLookingFor AS LF 
               WHERE LF.Status_finding = 'F' OR 
               LF.Status_finding = 'NM')AS LIST4) 

      GROUP BY LF.user_detail_Name 
      HAVING (COUNT(DISTINCT LIST.LIST_NO))>=2 

我的問題是,我無法作出確定每個被添加到他的列表中的人都被他發現了,如果我能把這個小組隔離開來,並且問我現在是否正在查看他的記錄(在ListContains表中)的人是我已經完成的。

的我想要什麼

例子:

ON TblListContains有以下條目:

AAA(LIST用戶),1(LIST用戶數),1(TREASURE_NO)

AAA,2,2-

AAA,1,3-

BBB,1,2-

ON TblLookingFor有以下條目:

1(寶藏號),AAA(用戶名),F(狀態),測試(評論),07/08/2016(日期),2(隱藏等級由用戶),3(地形的電平)

2,AAA,NM,testing2,07/08/2016,2,4

3,AAA,F,testing3,07/08/2016,2 ,4

2,BBB,NF,testing4,07/08/2016,2,4

我只想返回AAA(因爲他有至少2所列出並發現所有的寶藏在他名單)

我也會添加表方案爲您提供便利:

table scheme

有什麼建議?

感謝, 湯姆

+0

請編輯您的問題,並提供樣品數據和預期結果。寶物,用戶,名單。 。 。沒有看到數據就會變得混亂。 –

+0

只是增加了你的要求。 – Tom

+0

如果您使用兩個表的示例:T1&T2和屬性「A」,這可能會有所幫助。比你的問題會更短,更多的人會幫助你。 –

回答

0

我想我可能緩過勁來。

這裏是我想出瞭解決方案:

SELECT LIST.NAME 
      FROM(SELECT LC.user_name_detail AS NAME,LC.tressure_No AS T_NO,LC.num_Of_List_User AS LIST_NO 
       FROM dbo.tblListContains AS LC) AS LIST 

      WHERE LIST.NAME IN (SELECT LIST4.user_name_detail 
          FROM(SELECT LC.user_name_detail,LC.tressure_No 
           From dbo.tblListContains as LC 

               INTERSECT 

               SELECT LF.user_detail_Name,LF.tressure_No 
               FROM dbo.tblLookingFor AS LF 
               WHERE LF.Status_finding = 'F' OR 
               LF.Status_finding = 'NM')AS LIST4 INNER JOIN 
               dbo.tblListContains AS LC 
               ON LIST4.user_name_detail = LC.user_name_detail 
               AND LIST4.tressure_No = LC.tressure_No 
              GROUP BY LIST4.user_name_detail 
            HAVING COUNT(LIST4.tressure_No) = (SELECT COUNT(LC.tressure_No) 
                     FROM dbo.tblListContains AS LC 
                     WHERE LIST4.user_name_detail = LC.user_name_detail))          
GROUP BY LIST.NAME 
HAVING (COUNT(DISTINCT LIST.LIST_NO))>=2 
0

如果我明白你的要求正確,我們將只需要外部連接的所有「發現」 LF記錄的LC記錄。然後,我們的用戶和組檢查...

  • 是否所有的LC記錄有一個「發現」 LF記錄和
  • 列表的數量是否至少2

這裏是查詢:

select lc.user_name_detail 
from dbo.tbllistcontains lc 
left join dbo.tbllookingfor lf on lf.user_name_detail = lc.user_name_detail 
           and lf.tressure_no  = lc.tressure_no 
           and lf.status_finding in ('F', 'NM') 
group by lc.user_name_detail 
having count(*) = count(lf.user_name_detail) -- all found 
and count(distinct lf.list_no) >= 2; -- two or more lists 
相關問題