2015-02-04 4 views
1

У меня есть таблица, относящаяся к отзывам, сделанным человеком. Таблица содержит следующие поля: reviewId, PersonId, isComplete, где isComplete является логическим значением, указывающим завершен ли конкретный человек его обзор.Построить SQL-запрос, чтобы найти записи, имеющие все значения

Представьте себе следующие значения:

ReviewID | PersonID | isComplete | 

    1   1   1 
    2   1   1 
    3   2   0 
    4   2   0 
    5   3   1 
    6   3   0 

В этом случае я должен получить только PersonID = 1 в результате, так как только они завершили все свои отзывы. Я пробовал много запросов, и ближайший из них: SELECT * FROM reviews x WHERE 1 = ALL (SELECT isComplete FROM reviews y WHERE x.personid = y.personid AND isComplete=1);

Любые предложения или подсказки будут очень признательны.

+0

Подумайте об этом с точки зрения множеств. Вам нужен набор данных для всех людей и удалить из него набор людей, у которых хотя бы 1 обзор не завершен. – xQbert

ответ

1
SELECT DISTINCT(PersonID) FROM reviews 
WHERE PersonId NOT IN (
    SELECT DISTINCT(PersonID) FROM reviews WHERE isComplete = 0 
) 
+1

Спасибо, именно то, что мне нужно! – user3603634

+0

Glad 2 слышал, что :) –

2
  • Таблица A содержит все записи
  • Таблица B содержит все люди, которые имеют по крайней мере 1 выдающийся обзор.
  • Мы используем левое соединение и устранить аннулирует так, что остается только пользователи, имеющие записи без каких-либо выдающихся обзоров ...

.

SELECT Distinct A.PersonID 
FROM TABLE A 
LEFT JOIN Table B 
on A.PersonID = B.PersonId 
and B.isComplete = 0 
WHERE B.PersonId is null 

Я использовал только для возврата только 1 запись.

Другой способ сделать это (я считаю наиболее эффективным) было бы использовать такое Заявление о

SELECT Distinct A.PersonID 
FROM table A 
WHERE not exists (Select 1 from Table B where B.iscomplete=0 and A.PersonID=B.PersonID) 

В основном это говорит возвращения всех лиц, которые не имеют неполный обзор.

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

1

Существует не один способ сделать это.

SELECT * FROM reviews a WHERE a.PersonId NOT IN 
(SELECT b.PersonId FROM reviews b WHERE b.isComplete = 0) 

Это становится все лица, которые соответствуют isComplete = 0, а затем только в том числе лиц, которые не являются в этом списке.

+0

спасибо, что это сработало - мне просто нужен DISTINCT (PersonID), чтобы избавиться от дубликатов. – user3603634

+0

@ user3603634, да, я не был уверен, что вам нужно из списка, так как у вас есть '*' в вашем исходном запросе, поэтому я просто оставил его как это было. – Devon

Смежные вопросы