2015-10-05 69 views
0

可以說我有以下表格:比較基於另一個表的多個行

表1

ID Number 
1 2 
2 34 
3 1    <---- Input (ID = 3) ==> (Number = 1) 
4 6 
5 5 
*6* 7    <---- Want to find (Number = 6) because match in Table2 
7 22 

和表2

Number Code Att1 Att2 Att3 
    1  1  1       <-----| 
    1  2  1  2     <-----| 
    6  2  f  2       | 
    6  3  4  3  2     | 
    2  4  6         |---Match 
    22  5  2  2  2     | 
    5  2  h  3  b     | 
    7  1  1       <-----| 
    7  2  1  2     <-----| 
    7  h  5  r 

因此,這裏是我的問題: 我想從標識Table1具有給定(可變)輸入ID具有的來自表2的所有代碼和屬性。最後,我想創建一個存儲過程/函數,爲我提供滿足該條件的所有ID。

作爲示例: 輸入ID:3.將返回ID 6,因爲Number 7(從Table1中的ID 6映射)具有行Number 1(從Table 1中的ID 3映射)具有。它有更多但並不重要,它只是重要的是它有輸入的所有行。

(我無法找到一個解決方案,以一組行的比較,另一組的列是以前不知道的。)

感謝您的幫助!

編輯: 爲了使它更understandible,在這裏我想要的話一步一步。

  1. 地圖輸入ID來編號在表1

  2. 獲取全部由具有編號表2行從步驟1

  3. 獲取具有相同的所有數(可以有更多的)行從步驟2

  4. 獲取標識爲數字(和歸還)

+2

我不明白 –

+0

做出表評論,也許這有助於理解:) – MMMagic

+0

仍不清楚,不知道againt你有什麼配套'1'還包括慾望輸出。另外,爲什麼你使用'ID = 1'的樣本,但你描述使用'ID = 3'我不能按照你的解釋。看起來像匹配4行,但爲什麼只有一個結果? –

回答

2

嘗試類似這樣的事情。還沒有測試過,但基本上你內心加入了所有需要匹配的屬性。 HAVING子句是一個粗略的檢查,以確保它匹配所有行。編輯:忘了添加輸入ID WHERE子句。

SELECT t1b.ID FROM 
Table1 t1a 
INNER JOIN Table2 t2a ON t1a.Number = t2a.Number 
INNER JOIN Table2 t2b ON t2a.Number <> t2b.Number AND t2a.Code = t2b.CODE AND t2a.Att1 = t2b.Att1 AND t2a.Att2 = t2b.Att2 AND t2a.Att3 = t2b.Att3 
INNER JOIN Table1 t1b ON t1b.Number = t2b.Number 
WHERE t1a.ID = 3 
GROUP BY t1b.ID 
HAVING COUNT(*) = (SELECT COUNT(*) FROM Table1 WHERE ID = t1a.ID) 
+0

在第一次測試中,這似乎工作,我不得不再嘗試一些 - 特別是如果attr爲NULL(在第3行中,您忘記了t2a中的a .Number,以防您想編輯) – MMMagic

+0

哦,你更快地實現了相同的想法:) –

+0

@AndreyDavydenko :)雖然你的解決方案確實在GROUP BY中包含t1a.ID很好,如果你想擴展這個查詢來給你所有的配對,而不是t1a的輸出。 ID = 3。 –

0

很難理解你想要達到的目標。正如我從您的示例中瞭解的,您希望Number的輸入IDTable1的任何列(正確?)在Table2

隨着輸入ID=3SELECT將返回Number=7。在IN (...)-條件中,您可以指定要匹配的Table2中的任一列到Table1.Number

DECLARE @Input INT = 3 -- Your input 

SELECT DISTINCT t1.Number 
FROM Table1 t 
INNER JOIN Table2 t2 ON t.Number IN (t2.Number, t2.Code, t2.Att1, t2.Att2, t2.Att3) 
INNER JOIN Table1 t1 ON t2.Number = t1.Number AND t.ID <> t1.ID 
WHERE t.ID = @Input 
1
select t11.ID as Id_To_Find,t12.ID as Id_Found 
    from Table1 t11 
    join (
      select t21.Number as Found,t22.Number as ToFind from Table2 t21 
      left join Table2 t22 on t21.Code = t22.Code 
        and t21.Att1 = t22.Att1 
        and t21.Att2 = t22.Att2 
        and t21.Att3 = t22.Att3 
        and t21.Number <> t22.Number 
        group by t21.Number,t22.Number 
        having COUNT(*) = (select COUNT(*) from Table2 where Number = t22.Number)) 
      as FindMatches 
      on t11.Number = FindMatches.ToFind    
    join Table1 t12 on t12.Number = FindMatches.Found 
相關問題