代码之家  ›  专栏  ›  技术社区  ›  Organiccat

查询三组非对分数据

  •  0
  • Organiccat  · 技术社区  · 16 年前

    我正在检索三组不同的数据(或者应该是“唯一”行)。总的来说,我希望有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和名称匹配的数据集
    • ID匹配但名称不匹配的数据集
    • ID不匹配但名称不匹配的数据集

    当我将所有三个查询返回的结果相加时,我检索的行比T1中存在的行多,我认为这在逻辑上是不可能的,而且这意味着我必须在某个地方复制行(如果逻辑上可能的话),这会阻止我对每个集合执行不同的命令(因为一行将有另一个命令,例如在它上面)。

    有人能找到我哪里出错了吗?

    5 回复  |  直到 16 年前
        1
  •  2
  •   tvanfosson    16 年前

    考虑名称是否不唯一。如果您有以下数据:

    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和2分别与表2中的行1和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行。

        2
  •  1
  •   Eric Rosenberger    16 年前

    您确定两个表中的名称和ID都是唯一的吗?

    如果没有,您可能会遇到这样的情况,例如,表1中有:

    姓名:弗莱德 身份证:1

    表2有:

    姓名:弗莱德 身份证:1

    姓名:弗莱德 身份证:2

    在这种情况下,表1中的记录将由两个查询返回: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
    
        3
  •  1
  •   recursive    16 年前

    假设t2.id有一个唯一的约束,这个场景在逻辑上仍然可能发生。如果对于t1中的每个记录,t2中都有两个对应的记录:

    1. 相同的名字,相同的身份证,不同的地址
    2. 相同的名称、不同的ID、不同的地址

    例如,在第一个和第三个查询中可以出现T1的相同记录。

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

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

        4
  •  0
  •   shahkalpesh    16 年前

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

    也就是说,它依赖于两个表中的名称匹配(而不是ID)

        5
  •  0
  •   Chris Nava    16 年前

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

    (注意伪代码)

    将结果限制为仅从…中选择ID。

    • 合并结果集

    • 伯爵(身份证)

    • 按ID分组

    • 计数(ID)>1

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