需要子查询条件输出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了需要子查询条件输出相关的知识,希望对你有一定的参考价值。
我正在使用一组使用以下查询的车辆数据:
SELECT
VIN_NUM AS [Registration VIN]
,REGION_IND AS [Location of Registration]
,REG_CHANGE AS [Changed Location Since Last Check]
,CASE
WHEN REG_CHANGE = '' THEN REGION_IND
ELSE REG_CHANGE
END AS [Final Location]
FROM
dbo.All_Tests
WHERE
VIN_NUM LIKE '1FM%' AND
CASE
WHEN REGION_IND = '1' THEN 'Upstate'
WHEN REGION_IND = '2' THEN 'Downstate'
ELSE 'Unknown'
END = 'Downstate'
该查询从表中提取车辆VIN(VIN_NUM)以及它是否位于两个区域(REGION_IND),“1”或“2”之一中。它还会拉一列“REG_CHANGE”,检查自上次报告以来车辆登记是否改变了两个地区之间的位置。这三个都来自同一张桌子。
如果没有更改,则REG_CHANGE为空(不为NULL),如果有更改,则包含新的区域位置“1”或“2”。这在带有REGION_IND的CASE语句中用于为数据库中的所有车辆提供当前位置,别名为[最终位置]。
如果我想要原始区域,则代码有效,因为REGION_IND是一个表列。但是,我不能使用[Final Location],因为WHERE语句不允许使用别名。我认为这将是SELECT列中的子查询构造,但我不确定它是如何构造的。
有没有人有什么建议?
答案
一个有用的方法是在apply
clause中使用from
operator,然后允许在where子句中使用该列别名:
SELECT
VIN_NUM AS [registration vin]
, REGION_IND AS [location of registration]
, REG_CHANGE AS [changed location since last check]
, ca.[final location]
FROM dbo.All_Tests
CROSS APPLY (
SELECT
CASE
WHEN REG_CHANGE = '' THEN REGION_IND
ELSE REG_CHANGE
END AS [final location]
) ca
WHERE VIN_NUM LIKE '1FM%'
AND ca.[final location] = 'Downstate'
以下àpply
的任何进一步使用也可以使用这些列别名。
顺便说一句:虽然SQL select查询以select子句开头,但该子句在from和where子句之后执行。因此,在from子句中定义列别名使得该别名在查询执行的早期可用。
另一答案
你可以写下你的地方
SELECT
VIN_NUM AS [Registration VIN]
,REGION_IND AS [Location of Registration]
,REG_CHANGE AS [Changed Location Since Last Check]
,CASE
WHEN REG_CHANGE = '' THEN REGION_IND
ELSE REG_CHANGE
END AS [Final Location]
FROM
dbo.All_Tests
WHERE
VIN_NUM LIKE '1FM%' AND
(
(REGION_IND = '1' and REG_CHANGE ='Upstate') OR
(REGION_IND = '2' and REG_CHANGE ='Downstate') OR
(REG_CHANGE = 'Downstate')
)
以上是关于需要子查询条件输出的主要内容,如果未能解决你的问题,请参考以下文章
在 UNION 查询中执行 DISTRIBUTE BY 时是不是需要子查询?