【问题标题】:simple Group By简单分组
【发布时间】:2010-08-05 13:18:09
【问题描述】:

对不起这个简单的问题,但我错过了树林中的森林。

这些是我的表(我离开了备件表,因为我只是在寻找两个特殊的 fk):
(来源:bilder-hochladen.net

我需要来自 tabData 的不同行,这些行在子表 tabDataDetail 中以 fiSparePart=8837 8969 引用。 下面只给我那些至少有一个备件的行,但我需要那些都有。它们也没有区别,因为有从句。

SELECT     tabData.idData
FROM         tabData INNER JOIN
                      tabDataDetail ON tabData.idData = tabDataDetail.fiData
GROUP BY tabData.idData, tabDataDetail.fiSparePart
HAVING   tabDataDetail.fiSparePart IN (8837, 8969)
ORDER BY tabData.idData

感谢您的宝贵时间。

【问题讨论】:

    标签: sql sql-server tsql join group-by


    【解决方案1】:

    这应该会为您提供包含 8837 和 8969 作为备件的 tabData 记录。您可以使用 DISTINCT,并且不需要 group by。

    SELECT  
     DISTINCT tabData.idData
     FROM    tabData 
     WHERE   EXISTS (SELECT *
                      FROM tabDataDetail
                     WHERE tabData.idData = tabDataDetail.fiData
                       AND tabDataDetail.fiSparePart = 8837)
       AND   EXISTS (SELECT *
                      FROM tabDataDetail
                     WHERE tabData.idData = tabDataDetail.fiData
                       AND tabDataDetail.fiSparePart = 8969)
     ORDER BY tabData.idData
    

    【讨论】:

    • 谢谢。将“FROM tabDataDetail.fiSparePart”更改为“FROM tabDataDetail”时,它可以工作:)
    • @Tim - 哎呀,抱歉 :)。现已修复。
    • 顺便说一句,DISTINCT 关键字不是必需的,因为 idData 是 tabData 的 PK,因此是唯一的 ;)
    【解决方案2】:

    试试这个

    SELECT     tabData.idData
    FROM         tabData INNER JOIN
                          tabDataDetail ON tabData.idData = tabDataDetail.fiData
    WHERE tabDataDetail.fiSparePart IN (8837, 8969)
    GROUP BY tabData.idData, tabDataDetail.fiSparePart
    HAVING COUNT(distinct tabDataDetail.fiSparePart  ) > 1
    ORDER BY tabData.idData
    

    这是一个例子

    create table #bla (idData int, fiSparePart int)
    insert #bla values(1,8837)
    insert #bla values(1,8969)
    insert #bla values(2,8837)
    insert #bla values(2,8837)
    insert #bla values(2,8837)
    
    
    
    SELECT     idData
    FROM        #bla
    WHERE   fiSparePart IN (8837, 8969)
    GROUP BY idData
    HAVING COUNT(distinct fiSparePart) > 1
    

    【讨论】:

    • 如果 8837 出现两次,但 8969 根本没有出现怎么办?
    【解决方案3】:

    如果您从 tabData 获得的只是主键(它也作为外键存在于 tabDataDetail 中),则您不需要两个表。这是假设 tabData 是 tabDataDetail 的父表。

    SELECT a.fiData
    FROM (SELECT fiData FROM tabDataDetail WHERE fiSparePart = 8837) a
       INNER JOIN
         (SELECT fiData FROM tabDataDetail WHERE fiSparePart = 8969) b
       ON a.fiData = b.fiData
    

    【讨论】:

    • 感谢您的提示,当将“SELECT fiData”更改为“SELECT a.fiData”时它可以工作。
    【解决方案4】:
     SELECT     tabData.idData
     FROM         tabData INNER JOIN
                      tabDataDetail ON tabData.idData = tabDataDetail.fiData
     WHERE   tabDataDetail.fiSparePart IN (8837, 8969)
     GROUP BY tabData.idData, tabDataDetail.fiSparePart
     ORDER BY tabData.idData
    

    【讨论】:

    • ...而且查询也不会返回具有两个备件的所有 tabData 记录。
    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2021-01-16
    • 2013-06-30
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多