代码之家  ›  专栏  ›  技术社区  ›  Tim Schmelter

简单分组

  •  2
  • Tim Schmelter  · 技术社区  · 14 年前

    很抱歉这个简单的问题,但我错过了穿过树林的森林。

    这些是我的桌子(我离开了Sparepart桌子,因为我只找两个特殊的FK): alt text http://www.bilder-hochladen.net/files/4709-kx.jpg

    我需要与tabdata不同的行,它们在fisparepart=8837的子表tabdatadetail中引用。 8969。 下面只给出了至少有一个sparepart的行,但我需要同时具有这两个sparepart的行。由于HAVING子句,它们也不明显。

    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
    

    谢谢你抽出时间。

    4 回复  |  直到 14 年前
        1
  •  1
  •   dcp    14 年前

    这将为您提供将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
    
        2
  •  1
  •   SQLMenace    14 年前

    试试这个

    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
    
        3
  •  1
  •   dave    14 年前

    如果您从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
    
        4
  •  0
  •   Michael Pakhantsov    14 年前
     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