Как ссылаться на пользовательское поле в SQL - PullRequest
4 голосов
/ 18 сентября 2008

Я использую mssql и у меня возникли проблемы с использованием подзапроса. Реальный запрос довольно сложен, но имеет такую ​​же структуру, как эта:

select 
  customerName, 
  customerId,
  (
    select count(*) 
    from Purchases 
    where Purchases.customerId=customerData.customerId
  ) as numberTransactions
from customerData

И что я хочу сделать, это упорядочить таблицу по количеству транзакций, но когда я использую

order by numberTransactions

Это говорит мне, что такого поля нет. Можно ли сделать это? Должен ли я использовать какое-то специальное ключевое слово, такое как this или self?

Ответы [ 7 ]

8 голосов
/ 18 сентября 2008

используйте номер поля, в этом случае:

order by 3
7 голосов
/ 18 сентября 2008

Иногда приходится бороться с синтаксисом SQL (ожидаемый объем предложений)

SELECT *
FROM
(
select
  customerName,
  customerId,
  (
    select count(*)
    from Purchases
    where Purchases.customerId=customerData.customerId
  ) as numberTransactions
from customerData
) as sub
order by sub.numberTransactions

Кроме того, решение с использованием JOIN является правильным. Посмотрите на план запроса, SQL Server должен предоставить одинаковые планы для обоих решений.

4 голосов
/ 18 сентября 2008

сделать внутреннее соединение. Это намного проще и удобочитаемее.

select 
customerName,
customerID,
count(*) as numberTransactions
from
    customerdata c inner join purchases p on c.customerID = p.customerID
group by customerName,customerID
order by numberTransactions</p>

<p>
РЕДАКТИРОВАТЬ: Эй, Натан,

Вы понимаете, что можете присоединиться к целой таблице как к югу от права?

Select T.*, T2.*
From T inner join 
(select 
customerName,
customerID,
count(*) as numberTransactions
from
    customerdata c inner join purchases p on c.customerID = p.customerID
group by customerName,customerID
) T2 on T.CustomerID = T2.CustomerID
order by T2.numberTransactions

Или, если это нехорошо, вы можете строить свои запросы, используя временные таблицы (# T1 и т. Д.)

2 голосов
/ 18 сентября 2008

Есть лучшие способы получить ваш результат, но только из вашего примера запроса это будет работать на SQL2000 или лучше.

Если вы заключите свой псевдоним в один тик 'numberTransactions' , а затем позвоните ORDER BY 'numberTransactions'

select
  customerName, 
  customerId,
  (
    select count(*) 
    from Purchases 
    where Purchases.customerId=customerData.customerId
  ) as 'numberTransactions'
from customerData
ORDER BY 'numberTransactions'
0 голосов
/ 18 сентября 2008

Я думаю, вы можете сделать это в SQL2005, но не в SQL2000.

0 голосов
/ 18 сентября 2008

То же самое может быть достигнуто с помощью GROUP BY и JOIN, и вы избавитесь от подзапроса. Это тоже может быть быстрее.

0 голосов
/ 18 сентября 2008

Вам нужно продублировать свою логику. SQL Server не очень умен для столбцов, которые вы назвали, но не являются частью набора данных в вашем выражении FROM.

Так что используйте

select 
  customerName, 
  customerId,
  (
    select count(*) 
    from Purchases p
    where p.customerId = c.customerId
  ) as numberTransactions
from customerData c
order by (select count(*) from purchases p where p.customerID = c.customerid)

Кроме того, используйте псевдонимы, они упрощают чтение и обслуживание вашего кода. ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...