Множественные условия в заключении

У меня есть таблица, как показано ниже (с использованием SQL Server 2008 R2):

CREATE TABLE [dbo].[Data](
    [Id] [int] NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [IsBad] [bit] NOT NULL
) ON [PRIMARY]
GO

Insert into Data  values(100,'Book!',1)
Insert into Data  values(100,'Booklki**',1)
Insert into Data  values(100,'Book',0)
Insert into Data  values(100,'New Book ~~',1)
Insert into Data  values(100,'New Book',0)
Insert into Data  values(100,'B00k…>',1)
Insert into Data  values(101,'Tim3#',1)
Insert into Data  values(101,'%Timer%',1)
Insert into Data  values(101,'T1mer**',1)
Insert into Data  values(101,'Tim6',1)
Insert into Data  values(101,'[email protected]',1)
Insert into Data  values(102,'ABC',0)
Insert into Data  values(102,'CDE',0)

Мне нужно выбрать все ID , которые имеют все IsBad = 1 . Таким образом, запрос в таблице выше возвращает ID: 101 . Он не должен возвращать 102 или 100 , потому что эти ID имеют хотя бы один IsBad = 0 .

Я попробовал под запрос

select id,count(distinct isBad) as Total
from Data
group by id
having count(distinct isBad)= 1 

Этот запрос включает идентификаторы, имеющие все IsBad = 0 . но мне это не нужно. Я попытался добавить еще несколько условий в с предложением , используя AND , но получив ошибку.

Как действовать ? Любая помощь приветствуется.

EDIT: Мне нужно запустить запрос к таблице с 50 миллионами записей. Таким образом, запрос должен быть оптимизирован для возврата результата за меньшее время.

0
nl ja de

3 ответы

Обратный это - вы хотите «все ID, которые имеют все IsBad = 1», что означает, что идентификатор не может иметь никакого IsBad = 0:

SELECT ID FROM Data WHERE ID NOT IN (
    SELECT ID FROM Data WHERE IsBad = 0
)
2
добавлено
+1 для простейшего запроса ... Тем не менее, они занимают много времени для выполнения таблицы, содержащей около 50 М записей ... Могут ли они быть оптимизированы для возврата результата за меньшее время?
добавлено автор SKJ, источник
select  *
from    Data d1
where   not exists 
        (
        select  *
        from    Data d2
        where   d1.id = d2.id
                and d2.IsBad = 0
        )

Живой пример в SQL Fiddle.

Если вы просто ищете код id , вы можете использовать:

select  distinct id
... rest of the query is the same ...
2
добавлено
+1: Нравится это ... Мне нужно запустить этот запрос против таблицы с 50 миллионами записей. Таким образом, запрос занимает много времени. Можно ли это оптимизировать? Я отредактировал мой вопрос.
добавлено автор SKJ, источник
Добавление индекса в (id, IsBad) поможет
добавлено автор Andomar, источник

Медленность текущего ответа, вероятно, связана с использованием , где не существует . Я обычно обойти эту проблему с помощью left join и проверить отсутствие совпадения.

select *
from Data d1
left join (select * from Data where IsBad = 0) d2
  on d1.id = d2.id
where d2.id is null

Это старая должность, поэтому, вероятно, это не поможет оригинальному человеку, но, возможно, другие выиграют.

0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)