Что означает константа в запросе SELECT? - PullRequest
2 голосов
/ 26 июля 2011

Учитывая 2 запроса ниже:

1)

USE AdventureWorks
GO
SELECT a.ProductID, a.ListPrice
FROM Production.Product a
WHERE EXISTS (SELECT 1 FROM Sales.SalesOrderDetail b
          WHERE b.ProductID = a.ProductID)

2)

USE AdventureWorks
GO
SELECT a.ProductID, a.Name, b.SalesOrderID
FROM Production.Product a LEFT OUTER JOIN Sales.SalesOrderDetail b
ON a.ProductID = b.ProductID
ORDER BY 1

Мой единственный вопрос - знать, что означает число 1 в этих запросах?Как насчет того, чтобы поменять их на 2 или что-то еще?

Спасибо за помощь

Ответы [ 3 ]

7 голосов
/ 26 июля 2011

В первом случае это не имеет значения; на самом деле вы можете выбрать 2 или что угодно, потому что это запрос на существование. В общем, выбор константы может использоваться для других целей, помимо запросов на существование (он просто сбрасывает константу в столбец в наборе результатов), но запросы на существование - это то место, где вы, скорее всего, встретите константу.

Например, учитывая таблицу с именем person, содержащую три столбца: id, firstname, lastname и birthdate, вы можете написать запрос следующим образом:

select firstname, 'YAY'
from person
where month(birthdate) = 6;

и это вернет что-то вроде

name     'YAY'
---------------
Ani       YAY
Sipho     YAY
Hiro      YAY

Это не полезно, но возможно. Идея состоит в том, что в операторе select вы выбираете выражения , которые могут быть не только именами столбцов, но и константами и вызовами функций. Более вероятный случай:

select lastname||','||firstname, year(birthday)
from person;

Здесь || - это оператор конкатенации строк, а year - это функция, которую я составил.

Причина, по которой вы иногда видите 1 в запросах о существовании, заключается в следующем. Предположим, вы только хотели узнать, был ли человек, чье имя начиналось с буквы «Н», но вам было все равно, кто этот человек. Вы можете сказать

select id
from person
where lastname like 'H%';

но поскольку нам не нужен идентификатор, вы также можете сказать

select 1
from person
where lastname like 'H%';

потому что все, что вас волнует, это то, получаете ли вы непустой набор результатов или нет.

Во втором случае 1 - это номер столбца; это означает, что вы хотите, чтобы ваши результаты сортировались по значению в первом столбце. Если изменить это значение на 2, это упорядочит второй столбец.

Кстати, другое место, где выбираются константы, это когда вы выгружаете из реляционной базы данных в сильно денормализованный CSV-файл, который вы будете обрабатывать в NOSQL-подобных системах.

1 голос
/ 03 января 2012

Во втором случае 1 вовсе не является литералом.Скорее, это порядковый номер, указывающий, что набор результатов должен быть отсортирован по его первому столбцу.Если вы измените значение 1 на 4, запрос завершится с ошибкой, поскольку набор результатов содержит только три столбца.

0 голосов
/ 26 июля 2011

Кстати, причина, по которой вы используете константу типа 1 вместо фактического столбца, заключается в том, что вы избегаете ввода-вывода фактического получения значения столбца. Это может улучшить производительность.

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