我正在检索三组不同的数据(或者应该是“唯一”的行)。总的来说,我期望3个不同的唯一行集,因为我必须对每组数据完成不同的操作。但是,我检索的行数多于表中的总行数,这意味着我必须在某处检索重复的行。以下是我的三组查询示例:
SELECT DISTINCT t1.*
FROM table1 t1
INNER JOIN table2 t2
ON t2.ID = t1.ID
AND t2.NAME = t1.NAME
AND t2.ADDRESS <> t1.ADDRESS
SELECT DISTINCT t1.*
FROM table1 t1
INNER JOIN table2 t2
ON t2.ID = t1.ID
AND t2.NAME <> t1.NAME
AND t2.ADDRESS <> t1.ADDRESS
SELECT DISTINCT t1.*
FROM table1 t1
INNER JOIN table2 t2
ON t2.ID <> t1.ID
AND t2.NAME = t1.NAME
AND t2.ADDRESS <> t1.ADDRESS
如您所见,我选择(按查询顺序)
我在检索所有三个查询返回的结果数时,检索的行数比T1中存在的多,我认为这在逻辑上是不可能的,这意味着我必须在某处复制行(如果在逻辑上可行)这阻止我对每个集合执行不同的命令(因为一行将在其上执行另一个命令)。
有人能在这里找到我错的地方吗?
答案 0 :(得分:2)
考虑名称是否不唯一。如果您有以下数据:
Table 1 Table 2
ID Name Address ID Name Address
0 Jim Smith 1111 A St 0 Jim Smith 2222 A St
1 Jim Smith 2222 B St 1 Jim Smith 3333 C St
然后,查询1为您提供:
0 Jim Smith 1111 A St
1 Jim Smith 2222 B St
因为第1行和第1行表1中的2与第1行和第1行匹配2,分别见表2.
查询2不提供任何内容。
查询3为您提供
0 Jim Smith 1111 A St
1 Jim Smith 2222 B St
因为表1中的第1行与表2中的第2行匹配,而表1中的第2行与表2中的第1行匹配。因此,当表1中只有2行时,您将从表1中获得4行。
答案 1 :(得分:1)
您确定NAME和ID在两个表中都是唯一的吗?
如果没有,你可能会遇到一种情况,例如,表1中有这样的情况:
姓名:弗雷德 ID:1
和table2有这个:
姓名:弗雷德 ID:1
姓名:弗雷德 ID:2
在这种情况下,table1中的记录将由两个查询返回:ID和NAME都匹配,NAME匹配,但ID不匹配。
您可以通过交叉两个查询的每个组合来缩小问题范围,以找出重复项的内容,例如:
SELECT DISTINCT t1.*
FROM table1 t1
INNER JOIN table2 t2
ON t2.ID = t1.ID
AND t2.NAME = t1.NAME
AND t2.ADDRESS <> t1.ADDRESS
INTERSECT
SELECT DISTINCT t1.*
FROM table1 t1
INNER JOIN table2 t2
ON t2.ID = t1.ID
AND t2.NAME <> t1.NAME
AND t2.ADDRESS <> t1.ADDRESS
答案 2 :(得分:1)
假设T2.ID具有唯一约束,这种情况在逻辑上仍然可能发生。如果对于T1中的每条记录,T2中有两条相应的记录:
然后,T1的相同记录可以出现在第一个和第三个查询中。例如。
也可以在第二个和第三个查询中同时获取相同的行。
如果不保证T2.ID是唯一的,那么你可以在所有三个查询中从T1获得相同的行。
答案 3 :(得分:0)
我认为最后一个查询可能是获取额外行集的一个。
即。它依赖于两个表中的名称匹配(而不是ID)
答案 4 :(得分:0)
要查找有问题的数据(并帮助找到您的逻辑漏洞),我建议:
(警告伪代码)
将结果限制为SELECT id FROM ....
UNION结果集
COUNT(ID)
GROUP BY id
HAVING count(id)&gt; 1
这将显示与多个子查询匹配的记录。