Сложный запрос SQL

Рейтинг: 1Ответов: 3Опубликовано: 09.12.2014

Доброго времени суток.

Есть база данных, в которой находятся граждане и их категории. Граждане могут иметь несколько категорий (категории идут по номерам от 10 до 1000). Как можно вывести граждан, категория которых от 700 до 1000, но при этом они также не имеют категорию от 10 до 150?

БД - MS SQL SERVER. Я написал такой код, но он почему-то не работает:

SELECT table.fam, table.kat   
FROM table   
WHERE (table.kat BETWEEN 700 AND 1000 )and NOT EXISTS (SELECT table.fam   
FROM table WHERE table.kat  BETWEEN 100 AND 150)

Где fam - это фамилия, а kat - категория.

Ответы

▲ 2Принят

http://sqlfiddle.com/#!2/27126/1

Тогда почему просто так нельзя? Если нужны только фамилии, то из-под SELECT убрать table.kat и добавить слово DISTINCT

Обновление

@Ale_x, я вроде понял:

  fam    kat
 Vasya   900
 Vasya   150
 Vasya   700
 Fedya   800
 Fedya   999
Kirkorov 1000
Kirkorov 100

В итоге должно быть

Fedya 800
Fedya 999

По сути, всё сводится к тому, чтобы у конкретного имени в полях fam были только числа в диапазоне 700-1000.

Обновление

То есть, по сути, если есть:

Вася 700
Вася 500

то нас такой вася тоже не интересует, ибо 500 не в нужном диапазоне?

Тогда как-то так вроде:

SELECT t.fam, t.kat
FROM 
(SELECT m.fam, m.kat FROM mytable as m
WHERE m.kat BETWEEN 700 AND 1000) as t
WHERE t.fam NOT IN 
(SELECT p.fam from mytable as p WHERE p.kat NOT BETWEEN 700 AND 1000)

Думаю, это можно как-то оптимизировать.

▲ 2

Я бы не назвал этот запрос сложным.

SELECT table.fam FROM table WHERE table.kat BETWEEN 700 AND 1000 
except
SELECT table.fam FROM table WHERE table.kat  BETWEEN 100 AND 150

ЗЫ

Можно и ваш запрос допилить:

SELECT fam, kat   
FROM table t1  
WHERE (kat BETWEEN 700 AND 1000 ) and 
NOT EXISTS (SELECT 1
FROM table t2 WHERE t2.kat  BETWEEN 100 AND 150 and t1.fam = t2.fam)
▲ 2

Еще можно так:

select fam
from mytable
group by fam
having sum(iif(kat between 700 and 1000,1,0))>0
   and sum(iif(kat between 100 and 150,1,0))=0;