2012-04-06 4 views
0

В качестве примера, если у меня есть таблица:SQL запрос, чтобы получить идентификаторы строк на основе другого столбца

DECLARE @tmpTable TABLE 
(SectionID INT, 
    DetailID INT) 

я следующие данные:

SectionID DetailID 
1000   -1 
1000   0 
1000   -1 
1100   5000 
1100   0 
1200   0 
1200   0 
1300   7000 
1300   8000 

Как написать SQL для получения всех Идентификаторов Секций, которые имеют ВСЕ ДАННЫЕ ИДЕНТИФИКАЦИИ 0 или -1. В приведенном выше примере, SQL должен возвращать 1000 и 1200 (не 1100, как по крайней мере 1 пункта не 0 или -1)

+0

вы хотите результирующий набор, который имеет раздел идентификаторы, которые имеют только подробно идентификатор 0 или -1, а не какой-либо другой Detailid? – Brian

+0

@Brian Да, это так. – DotnetDude

ответ

3
SELECT DISTINCT SectionID 
FROM @tmpTable AS t 
WHERE NOT EXISTS 
     (SELECT * 
     FROM @tmpTable AS tt 
     WHERE tt.SectionID = t.SectionID 
      AND tt.DetailID NOT IN (-1, 0) 
    ) 

Я считаю, что это должно работать тоже, так как DetailID является целым числом и значения, которые вы проверяете (-1 и 0), не имеют между ними пробелов. И это может быть быстрее, с индексом на (SectionID, DetailID):

SELECT SectionID 
FROM @tmpTable AS t 
GROUP BY SectionID 
HAVING MAX(DetailID) <= 0 
    AND MIN(DetailID) >= -1 
+0

Почему '<= 0'? Я думаю, мы можем просто сделать «MAX (DetailID) = 0 И MIN (DetailID) = -1' правильно? – DotnetDude

+0

№ Ваш пример «1200» имеет как MAX, так и MIN как 0. –

0
select sectionId from mytable where detailId in (0,-1) 
and section id not in (select sectionid from mytable where detail_id > 0)