假设我有以下表格:
表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映射)具有。它有更多但无关紧要,它的重要性在于它具有输入的所有行。
(我找不到将一组行与之前未知的另一组行进行比较的解决方案。)
感谢您的帮助!
编辑: 为了让它更容易理解,这就是我想要的一步一步的语言。
将输入ID映射到表1中的数字
从Table2获取所有行,其中包含步骤1中的数字
从步骤2获取具有相同(可以有更多)行数的所有数字
获取该号码的ID(并将其返回)
答案 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)
有点难以理解你想要实现的目标。我从您的示例中了解到,您希望将Number
中ID
的输入Table1
与Table2
中的任意列(正确?)匹配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