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

Откуда:
Сообщений: 4
Подскажите пож-та, есть запрос вида:

select 
.. ,
..,
(select * .. from .. where ..) as p1
..
where
..
(select * .. from .. where ..) > 0
....

p1 и запрос который стоит в последнем where одинаковы. Будут ли они выполняться дважды?

Как можно p1 использовать в where? Если написать where p1>0 говорит нет такого столбца..
6 июл 11, 13:57    [10932070]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от select в where  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
sinq
Подскажите пож-та, есть запрос вида:

select 
.. ,
..,
(select * .. from .. where ..) as p1
..
where
..
(select * .. from .. where ..) > 0
....

p1 и запрос который стоит в последнем where одинаковы. Будут ли они выполняться дважды?

Как можно p1 использовать в where? Если написать where p1>0 говорит нет такого столбца..
Такой синтаксис возможен, только если в таблице одно поле.
В старых версиях можно сделать весь запрос без селекта в WHERE производной таблицей, а ограничение накладывать в WHERE SELECTа из этой производной таблицы.
В современных версиях лучше OUTER APPLY во FROM
6 июл 11, 14:03    [10932133]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от select в where  [new]
yado4eg
Member

Откуда:
Сообщений: 202
sinq,

наверное в WHERE там что-то типа :

where
..
EXISTS
(select * .. from .. where ..) > 0
....

смотря что возвращает запрос p1
если одно значение, то можно через переменную
declare @v ..
set @v = (p1)

и патома

select 
.. ,
..,
(select * .. from .. where ..) as p1
..
where
..
@v > 0
....
6 июл 11, 14:03    [10932141]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от select в where  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
Такой синтаксис возможен, только если в таблице одно поле.
Это я про звёздочку в корелированном подзапросе.
6 июл 11, 14:04    [10932146]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от select в where  [new]
sinq
Member

Откуда:
Сообщений: 4
yado4eg
sinq,
смотря что возвращает запрос p1
если одно значение, то можно через переменную
declare @v ..
set @v = (p1)

и патома

select 
.. ,
..,
(select * .. from .. where ..) as p1
..
where
..
@v > 0
....


p1 это COUNT(...)
попробовал как вы советуете-
Invalid column name 'p1'

Вот вырезка из моего запроса.

SELECT 
.....
  (SELECT COUNT(pmnt.id_doc) AS p1 FROM dbo.t1 kuh INNER JOIN dbo.payments pmnt ON (kuh.id_doc = pmnt.id_doc) INNER JOIN dbo.ost kup ON (kuh.p_id = kup.id) WHERE [b]kup.p3 = dbkup.p3[/b]) AS p1,
......
FROM
  dbo.mer t2
  INNER JOIN dbo.ost [b]dbkup[/b] ON (t2.p_id = dbkup.id)
  INNER JOIN dbo.clients ON (dbkup.c_id = dbo.clients.c_id)
.....
WHERE
.......
  SELECT COUNT(pmnt.id_doc) AS p1 FROM dbo.t1 kuh INNER JOIN dbo.payments pmnt ON (kuh.id_doc = pmnt.id_doc) INNER JOIN dbo.ost kup ON (kuh.p_id = kup.id) WHERE [b]kup.p3 = dbkup.p3[/b]) = 0
.....

Хочу избавиться от одинаковых запросов


sql2000
6 июл 11, 15:05    [10932779]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от select в where  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2392
Блог
sinq
yado4eg
sinq,
смотря что возвращает запрос p1
если одно значение, то можно через переменную
declare @v ..
set @v = (p1)

и патома

select 
.. ,
..,
(select * .. from .. where ..) as p1
..
where
..
@v > 0
....


p1 это COUNT(...)
попробовал как вы советуете-
Invalid column name 'p1'

Вот вырезка из моего запроса.

SELECT 
.....
  (SELECT COUNT(pmnt.id_doc) AS p1 FROM dbo.t1 kuh INNER JOIN dbo.payments pmnt ON (kuh.id_doc = pmnt.id_doc) INNER JOIN dbo.ost kup ON (kuh.p_id = kup.id) WHERE [b]kup.p3 = dbkup.p3[/b]) AS p1,
......
FROM
  dbo.mer t2
  INNER JOIN dbo.ost [b]dbkup[/b] ON (t2.p_id = dbkup.id)
  INNER JOIN dbo.clients ON (dbkup.c_id = dbo.clients.c_id)
.....
WHERE
.......
  SELECT COUNT(pmnt.id_doc) AS p1 FROM dbo.t1 kuh INNER JOIN dbo.payments pmnt ON (kuh.id_doc = pmnt.id_doc) INNER JOIN dbo.ost kup ON (kuh.p_id = kup.id) WHERE [b]kup.p3 = dbkup.p3[/b]) = 0
.....

Хочу избавиться от одинаковых запросов


sql2000
Ну так и сделайте
SELECT 
.....
  0 AS p1,
......
FROM
  dbo.mer t2
  INNER JOIN dbo.ost dbkup ON (t2.p_id = dbkup.id)
  INNER JOIN dbo.clients ON (dbkup.c_id = dbo.clients.c_id)
  INNER JOIN (SELECT kup.p3, COUNT(pmnt.id_doc) AS p1 
FROM dbo.t1 kuh INNER JOIN dbo.payments pmnt ON (kuh.id_doc = pmnt.id_doc) 
INNER JOIN dbo.ost kup ON (kuh.p_id = kup.id) 
GROUP BY kup.p3
HAVING COUNT(*)=0) a ON dbkup.p3=a.p3
.....
WHERE
.......
  .....
6 июл 11, 15:16    [10932899]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от select в where  [new]
yado4eg
Member

Откуда:
Сообщений: 202
sinq,

в вашем случае мой совет не поможет.
или использовать коррелированные подзапросы
или сделать как советует Павел Воронцов
6 июл 11, 15:58    [10933348]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от select в where  [new]
sinq
Member

Откуда:
Сообщений: 4
С ходу не взлетел, посмотрю ещё вечером, спасибо за помощь!
6 июл 11, 16:33    [10933741]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от select в where  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а может в CTE обернуть и все?
6 июл 11, 16:57    [10933958]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от select в where  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Crimean
а может в CTE обернуть и все?
Тогда получится два CTE (через запятую).
Из-за коррелированности подзапроса.
Сначала CTE с основным запросом, а потом CTE с коррелированным.

Но он же написал про SQL2000: 10932779
6 июл 11, 17:11    [10934061]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от select в where  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Или имеется в виду CTE из всего исходного запроса без условия на подзапрос, а условие на подзапрос во внешнем SELECTе?
Тогда это то же самое, что и производная таблица из второго поста.
6 июл 11, 17:14    [10934084]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить