比较多个行基于另一个表

时间:2015-10-05 12:56:17

标签: sql sql-server

假设我有以下表格:

表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具有给定(可变)输入ID所具有的Table2中的所有代码和属性。最后,我想创建一个存储过程/函数,为我提供满足该条件的所有ID。

作为一个例子: 输入ID:3。将返回ID 6,因为Number 7(从Table1中的ID 6映射)具有行号(从表1中的ID 3映射)具有。它有更多但无关紧要,它的重要性在于它具有输入的所有行。

(我找不到将一组行与之前未知的另一组行进行比较的解决方案。)

感谢您的帮助!

编辑: 为了让它更容易理解,这就是我想要的一步一步的语言。

  1. 将输入ID映射到表1中的数字

  2. 从Table2获取所有行,其中包含步骤1中的数字

  3. 从步骤2获取具有相同(可以有更多)行数的所有数字

  4. 获取该号码的ID(并将其返回)

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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 

答案 2 :(得分:0)

有点难以理解你想要实现的目标。我从您的示例中了解到,您希望将NumberID的输入Table1Table2中的任意列(正确?)匹配ID=3 }。

输入SELECT后,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 中的任意列。

a