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

Откуда: Донецк
Сообщений: 768
Всем привет. Подскажите, пожалуйста.
Мне необходимо переписать запрос таким образом , чтоб не было подзапросов:
SELECT * FROM dbo.Am a
WHERE NOT EXISTS(SELECT 1 FROM T WHERE Am= a.Id)
AND NOT EXISTS(SELECT 1 FROM TA WHERE Am= a.Id)

Поля AM обозначают одну и ту же сущность поля, только в разных таблицах
10 июл 11, 00:38    [10951697]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать запрос  [new]
qwerty112
Guest
Djeki
Всем привет. Подскажите, пожалуйста.
Мне необходимо переписать запрос таким образом , чтоб не было подзапросов:
SELECT * FROM dbo.Am a
WHERE NOT EXISTS(SELECT 1 FROM T WHERE Am= a.Id)
AND NOT EXISTS(SELECT 1 FROM TA WHERE Am= a.Id)

Поля AM обозначают одну и ту же сущность поля, только в разных таблицах


select * FROM dbo.Am a

left join

(SELECT Am FROM T

union

SELECT Am FROM TA) b

on a.Id=b.Am

where b.Am is null

если сервер 2008, то "поинтересней" вроде можно...
10 июл 11, 00:47    [10951718]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать запрос  [new]
Djeki
Member

Откуда: Донецк
Сообщений: 768
qwerty112
Djeki
Всем привет. Подскажите, пожалуйста.
Мне необходимо переписать запрос таким образом , чтоб не было подзапросов:
SELECT * FROM dbo.Am a
WHERE NOT EXISTS(SELECT 1 FROM T WHERE Am= a.Id)
AND NOT EXISTS(SELECT 1 FROM TA WHERE Am= a.Id)

Поля AM обозначают одну и ту же сущность поля, только в разных таблицах


select * FROM dbo.Am a

left join

(SELECT Am FROM T

union

SELECT Am FROM TA) b

on a.Id=b.Am

where b.Am is null

если сервер 2008, то "поинтересней" вроде можно...


Пробовал, тут получается подзапрос . Сервер 2008r2.
Почему необходимо переписать запрос: SSIS, к сожалению, не хочет работать с параметрами, если запрос,в который передается параметр, содержит подзапросы
10 июл 11, 01:03    [10951760]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать запрос  [new]
qwerty112
Guest
select * FROM dbo.Am a

left join T
  on a.Id=T.Am

left join TA
  on a.Id=TA.Am

where T.Am is null 
  and TA.Am is null
10 июл 11, 01:14    [10951785]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
qwerty112
select * FROM dbo.Am a

left join T
  on a.Id=T.Am

left join TA
  on a.Id=TA.Am

where T.Am is null 
  and TA.Am is null

В общем случае, не эквивалентный запрос.
10 июл 11, 13:10    [10952194]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать запрос  [new]
qwerty112
Guest
invm
В общем случае, не эквивалентный запрос.

исходному ?
этому ?
Djeki
Всем привет. Подскажите, пожалуйста.
Мне необходимо переписать запрос таким образом , чтоб не было подзапросов:
SELECT * FROM  dbo.Am a
WHERE NOT   EXISTS(SELECT 1 FROM T WHERE Am= a.Id)
AND   NOT   EXISTS(SELECT 1 FROM TA WHERE Am= a.Id)

Поля AM обозначают одну и ту же сущность поля, только в разных таблицах


...хотя, - даа
но только - в этом (исправленно) :)
select a.* FROM dbo.Am a

left join T
  on a.Id=T.Am

left join TA
  on a.Id=TA.Am

where T.Am is null 
  and TA.Am is null
10 июл 11, 13:17    [10952206]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
qwerty112,

Даже исправленный вариант не катит, т.к. нигде не оговаривается, что связи таблиц 1 к 1. Так что правильным является ваш первый вариант. Либо так:
select
 a.*
from
 dbo.Am a outer apply
 (select top (1) Am from T where Am = a.Id) T outer apply
 (select top (1) Am from TA where Am = a.Id) TA
where
 T.Am is null and
 TA.Am is null
10 июл 11, 14:19    [10952300]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Или так:
select distinct a.* FROM dbo.Am a

left join T
  on a.Id=T.Am

left join TA
  on a.Id=TA.Am

where T.Am is null 
  and TA.Am is null
10 июл 11, 14:21    [10952305]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать запрос  [new]
qwerty112
Guest
invm
qwerty112,

Даже исправленный вариант не катит, т.к. нигде не оговаривается, что связи таблиц 1 к 1.
...


invm,

давай-те коворить о "вкусе устриц, с теми кто их ел" правильно/неправильно на примерах

Вы можете привести пример данных, на которых эти 2-а запроса,
10951697
10952206
будут выдавать разный результат ?
10 июл 11, 15:06    [10952403]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
qwerty112,

Ну да, виноват лопухнулся. Там же not exists...
10 июл 11, 15:43    [10952460]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать запрос  [new]
qwerty112
Guest
invm
qwerty112,

Ну да, виноват лопухнулся. Там же not exists...

как Вы видели - я - тоже, - в первом примере :))
10 июл 11, 18:54    [10952666]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить