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

Откуда:
Сообщений: 238
у меня такой вопрос, почему MSSQL в Where не делает выборку по псевдониму

select Field1,Field2, (select 'f' from Table2 Where Table2.Field1=Table1.Field1) as myField From Table1 
Where myField='f'


ругается не может найти myField

приходиться писать

select Field1,Field2, (select 'f' from Table2 Where Table2.Field1=Table1.Field1) as myField From Table1 
Where  (select 'f' from Table2 Where Table2.Field1=Table1.Field1)='f'
28 май 15, 16:01    [17702301]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
iap
Member

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

потому что WHERE логически выполняется раньше, чем SELECT
28 май 15, 16:03    [17702312]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
Glory
Member

Откуда:
Сообщений: 104751
DNShark
почему MSSQL в Where не делает выборку по псевдониму

by design
28 май 15, 16:03    [17702314]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
select Field1,Field2, myField
From Table1 
outer apply (
  select 'f' as myField from Table2 Where Table2.Field1=Table1.Field1 
) b
Where myField='f'


Сообщение было отредактировано: 28 май 15, 16:04
28 май 15, 16:04    [17702321]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
DNShark
приходиться писать

select Field1,Field2, (select 'f' from Table2 Where Table2.Field1=Table1.Field1) as myField From Table1 
Where  (select 'f' from Table2 Where Table2.Field1=Table1.Field1)='f'
Лучше написать в виде подзапроса, с фильтром снаружи.
28 май 15, 16:05    [17702332]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
DNShark
Member

Откуда:
Сообщений: 238
а можно что-то придумать, чтобы 2 раза не писать код select? А то если он строк на 5, то неудобно.
28 май 15, 16:05    [17702337]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Гавриленко Сергей Алексеевич
select Field1,Field2, myField
From Table1 
outer apply (
  select 'f' as myField from Table2 Where Table2.Field1=Table1.Field1 
) b
Where myField='f'
Если WHERE требует myField='f', то OUTER превращается в CROSS.
Поэтому myField='f' в общем случае надо перенести в подзапрос.
А здесь просто убрать внешнее WHERE совсем.

Можно и JOIN приладить:
SELECT T1.Field1,T1.Field2,myField='f'
FROM Table1 T1
JOIN Table2 T2 ON T1.Field1=T2.Field1;
28 май 15, 16:24    [17702502]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
iap
Можно и JOIN приладить:
SELECT T1.Field1,T1.Field2,myField='f'
FROM Table1 T1
JOIN Table2 T2 ON T1.Field1=T2.Field1;
+1
Или это переписывается как предложил iap, или ТС выбрал очень плохой пример.

А вообще это очень плохая практика делать where по алиасу, потому как если в нем запихано выражение, то сервер скорее всего не сможет его развернуть для наложения фильтра, в итоге имеем кривую оценку кардинальности плюс невозможность использования индекса, потому как серверу сначала придется посчитать выражение, а потом наложить фильтр.
28 май 15, 20:23    [17703759]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
DNShark
а можно что-то придумать, чтобы 2 раза не писать код select? А то если он строк на 5, то неудобно.
Я же написал - сделате как подзапрос.
28 май 15, 21:30    [17704004]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1843
;WITH CTE AS (
  select Field1,Field2, (select 'f' from Table2 Where Table2.Field1=Table1.Field1) as myField From Table1)
SELECT * From CTE AS c
WHERE c.myField = 'f'
29 май 15, 01:16    [17704716]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1843
А вообще ваш запрос переписывается в виде:
select m.Id_Module, m.Name, 'f' from Module as m
where exists (select * from ModuleFunction mf where mf.Id_Module = m.Id_Module)
29 май 15, 01:29    [17704742]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
емил_
Guest
DNShark,

"почему MSSQL в Where не делает выборку по псевдониму"

Таблица. Колоны a и b.

select b as a from mytable where a = 1

Что должно означать "where a = 1" ?
29 май 15, 10:12    [17705331]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
DNShark
Member

Откуда:
Сообщений: 238
Суть примерно такая:

имеем:
Таблица 1 услуга 1. в которой поля id idФИО idОбъект
Таблица 2. услуга 2 в которой поля id idФИО idОбъект
Таблица 3. услуга 3 в которой поля id idФИО idОбъект
Таблица 4 список объектов
Таблица 5 список ФИО

Вывести для каждого ФИО следующее

объект , услуги (услуга 1/услуга 2/услуга 3)

без повторения объектов

в виде одной строки. Т.е.

объет,услуга
1 услуга 1 + услуга 2
2 услуга 1 + услуга 3
3 услуга 2

и т.д.

так неподходит :

объет,услуга
1 услуга 1
1 услуга 2
8 июн 15, 12:26    [17743947]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
Glory
Member

Откуда:
Сообщений: 104751
DNShark
Вывести для каждого ФИО следующее

объект , услуги (услуга 1/услуга 2/услуга 3)

без повторения объектов

в виде одной строки.

Сложение символьных полей описано в FAQ
8 июн 15, 12:28    [17743954]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
DNShark
Member

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

складывать я умею, просто запрос у меня получается такой

select объектИмя, (select 'У1' where Услуга1.idобъект=объект.id and Услуга1.idФИО=value)+
(select 'У2' where Услуга2.idобъект=объект.id and Услуга2.idФИО=value)+
(select 'У3' where Услуга3.idобъект=объект.id and Услуга3.idФИО=value) as Field
From Объект
Where
-- вместо Field<>'' пишется такая фня
(select 'У1' where Услуга1.idобъект=объект.id and Услуга1.idФИО=value)='У1' OR
(select 'У2' where Услуга2.idобъект=объект.id and Услуга2.idФИО=value)='У2' OR
(select 'У3' where Услуга3.idобъект=объект.id and Услуга3.idФИО=value)='У3'

и мне это не нравится ((
8 июн 15, 12:46    [17744055]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
Glory
Member

Откуда:
Сообщений: 104751
DNShark
складывать я умею, просто запрос у меня получается такой

Не умеете. Воспользуйтесь FAQ
8 июн 15, 12:47    [17744065]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
DNShark
складывать я умею, просто запрос у меня получается такой

select объектИмя, (select 'У1' where Услуга1.idобъект=объект.id and Услуга1.idФИО=value)+
(select 'У2' where Услуга2.idобъект=объект.id and Услуга2.idФИО=value)+
(select 'У3' where Услуга3.idобъект=объект.id and Услуга3.idФИО=value) as Field
From Объект
Where
-- вместо Field<>'' пишется такая фня
(select 'У1' where Услуга1.idобъект=объект.id and Услуга1.idФИО=value)='У1' OR
(select 'У2' where Услуга2.idобъект=объект.id and Услуга2.idФИО=value)='У2' OR
(select 'У3' where Услуга3.idобъект=объект.id and Услуга3.idФИО=value)='У3'

и мне это не нравится ((
Вам уже тут несколько раз написали, как избежать повторения подзапросов в Where .
8 июн 15, 14:32    [17744748]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
DNShark
Member

Откуда:
Сообщений: 238
alexeyvg, та вы как-то непонятно пишете. Вот Glory хоть и две строчки написал, но всё понятно.

переписал так

with t1 as (
select Объект,'У1' as options Where idФИО = value
Union ALL
select Объект,'У2' as options  Where idФИО = value
Union ALL
select Объект,'У3' as options  Where idФИО = value               
)
group by Объект,(select options as 'data()' from  t1 as t2 where t2.idОбъект=t1.idОбъект for xml path('')) from t1)


Glory спасибо.
8 июн 15, 15:11    [17744962]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
DNShark
alexeyvg, та вы как-то непонятно пишете. Вот Glory хоть и две строчки написал, но всё понятно.

переписал так

with t1 as (
select Объект,'У1' as options Where idФИО = value
Union ALL
select Объект,'У2' as options  Where idФИО = value
Union ALL
select Объект,'У3' as options  Where idФИО = value               
)
group by Объект,(select options as 'data()' from  t1 as t2 where t2.idОбъект=t1.idОбъект for xml path('')) from t1)



Glory спасибо.
Он имел в виду более общую задачу.
Когда данные хранятся в строках таблицы, а не в трёх заранее созданных таблицах.
Я даже не понимаю, почему их три?

И где у Вас FROM в конце-то концов?!
И где SELECT из CTE??
8 июн 15, 15:16    [17744998]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
iap
Member

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

может, почитаете справку про синтаксис SELECTа?
8 июн 15, 15:17    [17745006]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
DNShark
Member

Откуда:
Сообщений: 238
iap, их 3 потому что их 3). Так сложилось.

with t1 as (
select Объект,'У1' as options From table1 Where idФИО = value
Union ALL
select Объект,'У2' as options From table2 Where idФИО = value
Union ALL
select Объект,'У3' as options From table3 Where idФИО = value               
)
select Объект,(select options as 'data()' from  t1 as t2 where t2.idОбъект=t1.idОбъект for xml path('')) from t1
group by Объект
8 июн 15, 15:24    [17745068]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
DNShark
alexeyvg, та вы как-то непонятно пишете.
Вопрос бы задали, если непонятно :-)

select * from (
    select объектИмя, (select 'У1' where Услуга1.idобъект=объект.id and Услуга1.idФИО=value)+
                      (select 'У2' where Услуга2.idобъект=объект.id and Услуга2.idФИО=value)+
                      (select 'У3' where Услуга3.idобъект=объект.id and Услуга3.idФИО=value) as Field
    From Объект
) as t
Where Field<>''
8 июн 15, 20:49    [17746634]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
iap
Member

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

А если подселекты вернут более одного значения каждый?
9 июн 15, 09:16    [17747797]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
iap
alexeyvg,

А если подселекты вернут более одного значения каждый?
Ну, я на конкретный вопрос отвечал, про "как избежать повторения подзапросов в Where".

И вообще, в данном случае - не вернут, тут даже FROM нету :-)
9 июн 15, 18:29    [17751539]     Ответить | Цитировать Сообщить модератору
 Re: Использование псевдонима в Where  [new]
Дед-Папыхтет
Member [заблокирован]

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

apply тебя спасет
10 июн 15, 17:50    [17756773]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить