Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Синтаксис SQL мешает написать запрос  [new]
btahkeeeeeeeee
Member

Откуда:
Сообщений: 16
есть 2 таблицы - Contract и Insurance_Agent. В Insurance_Agent все значения Agent_ID , то есть номера агентов и Insurance_ID , то есть страховые типы в которых этот агент разбирается, а есть таблица Contract , в которой Agent_ID и Insrance_ID могут быть отличные от Insurance_Agent. Так вот, нужно найти агентов, которые лезут заключать контракты по тем страховым типам, в которых они не разбираются. Это я удачно сделал таким образом:
 select Agent_ID,Insurance_ID 
 from Contract
 except
 select Agent_ID,Insurance_ID 
 from Insurance_Agent 

Но теперь мне нужно использовать результат этих преобразований для вывода полной информации о контрактах с такими Agent_ID И Insurance_ID. Sql строго-настрого запрещает мне писать что-то типо:
Select c.*
 from
 (select Agent_ID,Insurance_ID from Contract
 except select Agent_ID,Insurance_ID 
 from Insurance_Agent) as a inner join Contract as c on a.Agent_ID=c.Agent_ID
 where c.Agent_ID in 
 (select Agent_ID,Insurance_ID from Contract
 except select Agent_ID,Insurance_ID 
 from Insurance_Agent) 
 and c.Insurance_ID in 
 (select Agent_ID,Insurance_ID from Contract
 except select Agent_ID,Insurance_ID 
 from Insurance_Agent)

Даже если это и работало бы, мне кажется я бы не вывел то, что мне нужно.
Я не знаю как это сделать, может есть какие-то окольные пути?
На скриншоте слева главная таблица, там где находятся пары Agent_ID,Insurance_ID , которые возможны, а вторая таблица, за ней расположенная с парами Agent_ID,Insurance_ID , которые могут не быть, но контракты были заключены с типами страховок, в которых данный агент не разбирается. Если кто-то мне покажет как вывести номера этих контрактов и всю остальную информацию, из таблицы контрактов о таких злополучных соглашениях- буду очень благодарен!

К сообщению приложен файл. Размер - 91Kb
19 ноя 14, 03:53    [16869144]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис SQL мешает написать запрос  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
btahkeeeeeeeee,

Вам мешает не синтаксис, а незнание синтаксиса :)

SELECT *
FROM dbo.Contract C
WHERE NOT EXISTS (SELECT * FROM dbo.Insurance_Agent IA
                   WHERE IA.Agent_ID=C.Agent_ID AND IA.Insurance_ID=C.Insurance_ID)

Заранее пожалуйста.
19 ноя 14, 05:28    [16869180]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис SQL мешает написать запрос  [new]
Klemzig
Guest
btahkeeeeeeeee,

select c.*
from dbo.Contract c
	left join dbo.Insurance_Agent ia on c.Agent_ID = ia.Agent_ID and c.Insurance_ID = ia.Insurance_ID
where ia.Agent_ID is null;
19 ноя 14, 05:28    [16869181]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис SQL мешает написать запрос  [new]
btahkeeeeeeeee
Member

Откуда:
Сообщений: 16
Ruuu
btahkeeeeeeeee,

Вам мешает не синтаксис, а незнание синтаксиса :)

SELECT *
FROM dbo.Contract C
WHERE NOT EXISTS (SELECT * FROM dbo.Insurance_Agent IA
                   WHERE IA.Agent_ID=C.Agent_ID AND IA.Insurance_ID=C.Insurance_ID)

Заранее пожалуйста.

Спасибо=)Помогли неучу)
19 ноя 14, 09:09    [16869404]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис SQL мешает написать запрос  [new]
btahkeeeeeeeee
Member

Откуда:
Сообщений: 16
Klemzig
btahkeeeeeeeee,

select c.*
from dbo.Contract c
	left join dbo.Insurance_Agent ia on c.Agent_ID = ia.Agent_ID and c.Insurance_ID = ia.Insurance_ID
where ia.Agent_ID is null;

Спасибо,и ваше работает=)Да как так то((( я крутил его неделю,а вы все знаете(((
19 ноя 14, 09:10    [16869409]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис SQL мешает написать запрос  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
btahkeeeeeeeee,

да и с except можно при желании, но запрос немного усложняется, лучше как Ruuu написал через not exists()

select c.*
from Contract as c
where exists(
    select c.Agent_ID, c.Insurance_ID 
    except
    select i.Agent_ID, i.Insurance_ID 
    from Insurance_Agent
)


и учтите, что варианты с not exists и left join будут работать не совсем как except в случае Agent_ID = NULL или Insurance_ID = NULL, потому что там сравнение через "=". в вашей постановке задачи NULL нет и это не критично, но в общем случае результаты разные
19 ноя 14, 10:12    [16869761]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить