Почему работает псевдоним в предложении hasing? - PullRequest
0 голосов
/ 17 июня 2019

Я использую группу по запросу, и в моем запросе есть предложение, и кажется, что он работает нормально, используя псевдоним.Независимо от того, какое значение я ввел или оператор (<,>), он вернёт правильный результат.Согласно логической обработке запросов это не должно работать, но это работает.Кроме того, даже если я добавлю какую-то бессмысленную строку в функцию count в предложении have, она все равно будет работать.

Я совершенно сбит с толку!

use TSQL2014;
select
c.categoryname,
count(p.productid) as 'TotalProducts'
from Production.Products p

left join Production.Categories c
on p.categoryid = c.categoryid

group by c.categoryname

--having count(p.productid) > 10 
having count('aaaaaa') > 10

order by 'TotalProducts' desc;

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

Почему работает псевдоним в предложении has?

'aaaaaa' не псевдоним, а строковый литерал.

having count('aaaaaa') > 10
-- same as
       count(*)
       count(1) 
       count(GETDATE())

Пока выражение не NULL, COUNT будет работать правильно.

0 голосов
/ 17 июня 2019

Предполагается, что вы ссылаетесь на строку, закомментированную в данный момент в коде, который вы разместили - псевдоним p был использован в предложении from - это означает, что вы можете использовать его в любом другом предложении в запросе, включаяподзапросы, имеющие предложение, и даже применяют предложения и предложения объединения.

Это неверно при использовании псевдонима в предложении select - эти псевдонимы могут использоваться только в предложении order by.

select
c.categoryname,
count(p.productid) as 'TotalProducts'
from Production.Products p

left join Production.Categories c

-- both `p` and `c` aliases are valid here since they where introduced in the `from` and `join` clauses
on p.categoryid = c.categoryid

-- the use of `c` here is valid since it was introduced in the `join` clause
group by c.categoryname

-- the use of `p` here is valid since `p` was introduced in the `from` clause.
having count(p.productid) > 10 

-- This, however, will cause an error - invalid column name `TotalProducts`
-- having count(TotalProducts) > 10 

-- This is valid since TotalProducts is an alias introduced in the `select` clause.
order by 'TotalProducts' desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...