我正在使用 T-SQLCOALESCE函数,其中第一个参数在大约 95% 的运行时间不会为空。如果第一个参数是NULL,第二个参数是一个相当漫长的过程:
SELECT COALESCE(c.FirstName
,(SELECT TOP 1 b.FirstName
FROM TableA a
JOIN TableB b ON .....)
)
Run Code Online (Sandbox Code Playgroud)
例如,如果 ,c.FirstName = 'John'SQL Server 仍会运行子查询吗?
我知道使用 VB.NETIIF()函数,如果第二个参数为 True,代码仍会读取第三个参数(即使不会使用它)。
让我们检查这两个语句:
IF (CONDITION 1) OR (CONDITION 2)
...
IF (CONDITION 3) AND (CONDITION 4)
...
Run Code Online (Sandbox Code Playgroud)
如果CONDITION 1是TRUE,会CONDITION 2被检查吗?
如果CONDITION 3是FALSE,会CONDITION 4被检查吗?
条件如何WHERE:SQL Server 引擎是否优化WHERE子句中的所有条件?程序员是否应该以正确的顺序放置条件以确保 SQL Server 优化器以正确的方式解析它?
添加:
感谢 Jack 提供链接,来自 t-sql 代码的惊喜:
IF 1/0 = 1 OR 1 = 1
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
IF 1/0 = 1 AND 1 = 0
SELECT 'True' …Run Code Online (Sandbox Code Playgroud) 我已经使用 SQL Server 从备份文件恢复了 Northwind 数据库(https://northwinddatabase.codeplex.com/)。
尝试执行以下查询会导致错误“无效的列名 'products'。”,product 是别名。
SELECT OrderID, COUNT(ProductID) products
FROM [NORTHWND].[dbo].[OrderDetails]
GROUP BY OrderID
HAVING products > 5;
Run Code Online (Sandbox Code Playgroud)
问题是什么?
如果我这样做——
SELECT dv.Name
,MAX(hb.[DateEntered]) as DE
FROM
[Devices] as dv
INNER JOIN
[Heartbeats] as hb ON hb.DeviceID = dv.ID
WHERE DE < '2013-03-04'
GROUP BY dv.Name
Run Code Online (Sandbox Code Playgroud)
我收到这个错误——
消息 207,级别 16,状态 1,第 17 行 列名“DE”无效。
如果我这样做——
SELECT Name, DE FROM (
SELECT dv.Name
,MAX(hb.[DateEntered]) as DE
FROM
[Devices] as dv
INNER JOIN
[Heartbeats] as hb ON hb.DeviceID = dv.ID
GROUP BY dv.Name
) as tmp WHERE tmp.DE < '2013-03-04'
Run Code Online (Sandbox Code Playgroud)
它按预期工作。
有人可以解释为什么我需要将主查询嵌套为子查询来限制我的数据集吗?
另外,这里是否有更好的方法来实现目标?从一张表中检索所有记录,以及按[DateEntered]降序排列的单个“顶部”相关记录?
任何人都可以帮助解决这个错误吗?
SQL:
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total,
CASE
WHEN Total < 2.00 THEN 'Baseline Purchase'
WHEN Total BETWEEN 2.00 AND 6.99 THEN 'Low Purchase'
WHEN Total BETWEEN 7.00 AND 15.00 THEN 'Target Purchase'
ELSE 'Top Performer'
END AS PurchaseType
FROM
invoices
WHERE
PurchaseType = 'Top Performer'
ORDER BY
BillingCity
Run Code Online (Sandbox Code Playgroud)
错误:消息 207,级别 16,状态 1,第 13 行列名称“PurchaseType”无效。