对不起这个简单的问题,但我错过了穿过树林的森林。
这些是我的桌子(我离开了备用桌,因为我只找两个特殊的fk): alt text http://www.bilder-hochladen.net/files/4709-kx.jpg
我需要来自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
感谢您的时间。
答案 0 :(得分:1)
试试这个
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
答案 1 :(得分:1)
这应该为您提供同时包含8837和8969的tabData记录。您可以使用DISTINCT,并且不需要分组。
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)
如果您从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
答案 3 :(得分:0)
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