查询三个非二等分数据集

时间:2008-12-24 20:24:20

标签: sql sql-server

我正在检索三组不同的数据(或者应该是“唯一”的行)。总的来说,我期望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

如您所见,我选择(按查询顺序)

  • id AND name匹配的数据集
  • id匹配但名称不
  • 的数据集
  • id不匹配但名称为DOES
  • 的数据集

我在检索所有三个查询返回的结果数时,检索的行数比T1中存在的多,我认为这在逻辑上是不可能的,这意味着我必须在某处复制行(如果在逻辑上可行)这阻止我对每个集合执行不同的命令(因为一行将在其上执行另一个命令)。

有人能在这里找到我错的地方吗?

5 个答案:

答案 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中有两条相应的记录:

  1. 同名,同名,不同地址
  2. 同名,不同身份,不同地址
  3. 然后,T1的相同记录可以出现在第一个和第三个查询中。例如。

    也可以在第二个和第三个查询中同时获取相同的行。

    如果不保证T2.ID是唯一的,那么你可以在所有三个查询中从T1获得相同的行。

答案 3 :(得分:0)

我认为最后一个查询可能是获取额外行集的一个。

即。它依赖于两个表中的名称匹配(而不是ID)

答案 4 :(得分:0)

要查找有问题的数据(并帮助找到您的逻辑漏洞),我建议:

(警告伪代码)

将结果限制为SELECT id FROM ....

  • UNION结果集

  • COUNT(ID)

  • GROUP BY id

  • HAVING count(id)&gt; 1

这将显示与多个子查询匹配的记录。