【问题标题】:Finding items in child table referencing records in master table not referenced by other children在子表中查找引用主表中未被其他子表引用的记录的项目
【发布时间】:2016-09-24 13:03:20
【问题描述】:

我有一个包含两个表MasterTableChildrenTable 的数据库,它们之间是一对多的关系。 (当然这只是数据库的一部分)

我需要在ChildrenTable 中查找记录,这是主表中唯一引用项目的记录。 (例如,如果这是唯一链接到 Master1 的孩子,我需要找到 Child1,但如果 Child3 也链接到 Master2,则不需要找到 Child2)。

我知道我也可以使用子查询来完成,但我认为另一种方法会更容易:

SELECT
  MasterTable.Name,
  ChildrenTable.Name
FROM 
  MasterTable INNER JOIN ChildrenTable
  ON MasterTable.ID = ChildrenTable.MasterID
  LEFT JOIN ChildrenTable ChildrenTable1
  ON MasterTable.ID = ChildrenTable1.MasterID
WHERE
  ChildrenTable.Name = 'SomeName' 
  AND ChildrenTable.ID <> NVL(ChildrenTable1.ID,0)
  AND ChildrenTable1.ID Is Null;

但是这个查询没有给我任何结果。当我排除最后一个条件时,我得到结果,但只有ChildrenTable1.ID 不为空的那些(我检查了数据,应该找到记录。)

我该如何解决这个问题?

【问题讨论】:

    标签: sql oracle11g null


    【解决方案1】:

    这是 SQL Server 语法。不确定它是否直接翻译成 Oracle 的方言:

    SELECT MAX(ID), MasterID
    FROM ChildrenTable
    WHERE MasterID IS NOT NULL
    GROUP BY MasterID
    HAVING COUNT(1) = 1
    

    如果孩子可以存在于不同的表中,一个选项可能是 UNION 他们:

    SELECT MAX(u.ID), u.MasterID
    FROM 
    (
     SELECT c1.ID, c1.MasterID
     FROM ChildrenTable c1
     WHERE c1.MasterID IS NOT NULL
     UNION ALL
     SELECT c2.ID, c2.MasterID
     FROM SomeOtherChildTable c2
     WHERE c2.MasterID IS NOT NULL
    ) u
    GROUP BY u.MasterID
    HAVING COUNT(1) = 1
    

    【讨论】:

    • 谢谢!为什么是MAX 而不是Count
    • MAX 将为您提供子行的 ID,以便您知道它是哪一行(例如加入它,也许)。使用 COUNT 将在结果集的每一行的第一列中返回“1”,因为每一行代表一组 1 个项目。
    • 我认为 COUNT(1) 只是一个旧习惯。早在 2000 年代初,一位 DB 人员曾告诉我,这是一种优化(与 COUNT(somecolumn) 相反)。如果那是真的,我敢打赌它不再是真的了。所以 COUNT(1) 和 COUNT(columnname) 可能结果是功能相同的查询计划执行相同。
    • 所以它可能只在你只从一个表中选择时才有效。但是我需要从多个中进行选择。
    • 我认为您可能需要一个子查询。一种方法可能是将在每个子表上生成 (ID, MasterID) 的查询结果进行联合,然后对该联合结果执行 GROUP BY。一秒钟,我会把它添加到我上面的答案中。
    猜你喜欢
    • 1970-01-01
    • 2022-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多