考虑以下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或其他什么怎么样?
感谢您的帮助
答案 0 :(得分:7)
在第一种情况下无所谓;你可以选择2或任何东西,因为它是一个存在查询。通常,选择一个常量可以用于存在查询之外的其他事物(它只是将常量放入结果集中的一列),但是存在查询是您最有可能遇到常量的地方。
例如,如果一个名为person
的表包含三列,id
,firstname
,lastname
和birthdate
,那么可以< / em>写一个这样的查询:
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
的原因是这样的。假设你只想知道是否有一个名字以'H'开头的人,但你不在乎这个人是谁。你可以说
select id
from person
where lastname like 'H%';
但由于我们不需要id,你也可以说
select 1
from person
where lastname like 'H%';
因为你关心的是你是否得到非空结果集。
在第二种情况下,1是列号;这意味着您希望您的结果按第一列中的值排序。将其更改为2将按第二列排序。
顺便说一下,选择常量的另一个地方是从关系数据库转储到高度非规范化的CSV文件,你将在类似NOSQL的系统中进行处理。
答案 1 :(得分:1)
在第二种情况下,1
根本不是文字。相反,它是一个序数,表示结果集应按其第一列排序。如果您将1
更改为4
,则查询将失败并显示错误,因为结果集只有三列。
答案 2 :(得分:0)
BTW,你使用常量如1
而不是使用实际列的原因是你避免了实际获取列值的I / O.这可能会提高性能。