простой Group By - PullRequest
       34

простой Group By

2 голосов
/ 05 августа 2010

Извините за этот простой вопрос, но я скучаю по лесу из-за деревьев.

Это мои таблицы (я покинул таблицу запасных частей, потому что я ищу только две специальные ФК): альтернативный текст 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

Спасибо за ваше время.

Ответы [ 4 ]

1 голос
/ 05 августа 2010

Для этого вам не нужны две таблицы, если все, что вы получаете от 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
1 голос
/ 05 августа 2010

Это должно дать вам записи tabData, которые имеют как 8837, так и 8969 как запасные части.Вы можете использовать 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
1 голос
/ 05 августа 2010

Попробуйте это

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
0 голосов
/ 05 августа 2010
 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
...