2015-10-05 48 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 
相关问题