【问题标题】:Get TOP rows out of child table WITH inner join使用内部连接从子表中获取 TOP 行
【发布时间】:2009-12-21 15:54:33
【问题描述】:

我想根据 ID 与子表进行内部连接并获取子表的顶行, 我不会加入从子表中取出任何数据,它只是为了验证父表是否存在子表记录。 如果我不包括 TOP 行,则有可能在结果集中获得多行父级。

-- 同一 PARENTID 的结果集中有可能出现多行

从父 P 中选择 P.PARENTID
INNER JOIN CHILD C ON C.PARENTID = P.PARENTID 和 C.ISACTIVE = 1

我需要类似的东西

从父 P 中选择 P.PARENTID
INNER JOIN (SELECT TOP 1 * FROM CHILD) 作为 C
ON C.PARENTID = P.PARENTID AND C.ISACTIVE = 1

我不知道如何让它工作 我很好奇是否有人可以帮助我或提供我可以找到解决方案的任何网址

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    你认为 WHERE EXISTS 能胜任这项工作吗?

    SELECT P.PARENTID FROM PARENT P 
    WHERE EXISTS (SELECT 1  FROM CHILD C 
    WHERE C.PARENTID = P.PARENTID 
    AND C.ISACTIVE = 1)
    

    【讨论】:

    • 是的...我不知道我是怎么忘记 EXIST 子句的,这个是最有效的...谢谢
    【解决方案2】:

    这样做不是更好吗:

    SELECT * FROM parent WHERE parentId not in ( select parentid from child where isactive = 1 )
    

    通过这样做,您将获得 'parent' 中所有在 'child' 中没有关联记录的记录的列表。

    为了检索在 child 中有记录的父母,只需反转条件:

    select * from parent where parentId in ( select distinct parentId from  child where isactive = 1 )
    

    我在这里指定了 distinct,以确保每个 parentId 只列出一次,这样父级本身在结果集中也只返回一次。

    【讨论】:

    • 实际上我正在寻找的是获得其活动孩子存在的父母
    • 然后只是颠倒条件,而不是'不在',你指定'in' select * from parent where parentid in (select parentid from child)
    【解决方案3】:

    可能不是最有效的方法,但是:

    SELECT p.parentid FROM parent p
    WHERE (SELECT COUNT(*) FROM child c WHERE c.parentid = p.parentid AND c.isactive)
        >= 1
    

    【讨论】:

      猜你喜欢
      • 2014-07-07
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 2011-08-24
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多