如何将多条语句合并为一条选择语句。
我试过但得到错误:“当子查询没有通过 EXISTS 引入时,只能在选择列表中指定一个表达式。”
下面我已经提到了所有 4 个陈述。
声明 1
SELECT *
FROM (SELECT ROW_NUMBER() OVER(
ORDER BY
CASE WHEN ISNUMERIC(ProductCode) = 0
THEN CAST(LEFT(RIGHT(ProductCode,LEN(ProductCode)-CHARINDEX('-',ProductCode)), patindex('%[^0-9]%', RIGHT(ProductCode,LEN(ProductCode)-CHARINDEX('-',ProductCode))+'.') - 1) AS INT)
ELSE ProductCode END
, ProductCode
) AS Num1
, ProductCode + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) + ProductName AS ProductCodeName1
FROM BASE_Product
WHERE IsActive = 1
) BASE_Product
WHERE Num1 > 0 AND Num1 < (95 + 1)
Run Code Online (Sandbox Code Playgroud)
声明 2
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY CASE WHEN ISNUMERIC(ProductCode) = 0 THEN CAST(LEFT(RIGHT(ProductCode,LEN(ProductCode)-CHARINDEX('-',ProductCode)), patindex('%[^0-9]%', RIGHT(ProductCode,LEN(ProductCode)-CHARINDEX('-',ProductCode))+'.') - 1) AS INT) ELSE ProductCode END, ProductCode) AS Num2, ProductCode + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) + ProductName AS ProductCodeName2 `
FROM BASE_Product WHERE IsActive = 1) BASE_Product WHERE Num2 > 95 AND Num2 < ((95*2) + 1)
Run Code Online (Sandbox Code Playgroud)
声明 3
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY CASE WHEN ISNUMERIC(ProductCode) = 0 THEN CAST(LEFT(RIGHT(ProductCode,LEN(ProductCode)-CHARINDEX('-',ProductCode)), patindex('%[^0-9]%', RIGHT(ProductCode,LEN(ProductCode)-CHARINDEX('-',ProductCode))+'.') - 1) AS INT) ELSE ProductCode END, ProductCode) AS Num3, ProductCode + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) + ProductName AS ProductCodeName3
FROM BASE_Product WHERE IsActive = 1) BASE_Product WHERE Num3 > (95*2) AND Num3 < ((95*3) + 1)
Run Code Online (Sandbox Code Playgroud)
声明 4
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY CASE WHEN ISNUMERIC(ProductCode) = 0 THEN CAST(LEFT(RIGHT(ProductCode,LEN(ProductCode)-CHARINDEX('-',ProductCode)), patindex('%[^0-9]%', RIGHT(ProductCode,LEN(ProductCode)-CHARINDEX('-',ProductCode))+'.') - 1) AS INT) ELSE ProductCode END, ProductCode) AS Num4, ProductCode + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) + ProductName AS ProductCodeName4
FROM BASE_Product WHERE IsActive = 1) BASE_Product WHERE Num4 > (95*3) AND Num4 < ((95*4) + 1)
Run Code Online (Sandbox Code Playgroud)
我试过
您应该在问题中包括您尝试过的内容 - 您可以提供的任何细节都有助于我们帮助您理解。
如何将多条语句合并为一条选择语句。
您没有说出您实际期望的输出,所以我只是在这里猜测。我怀疑您希望将这四个查询中的每一个的行输出到一个结果UNION集中,在这种情况下,您需要设置运算符,请参阅https://docs.microsoft.com/en-us/sql/t-sql/language -elements/set-operators-union-transact-sql了解详情。
对于通用示例:
SELECT <columns> FROM <tables_or_views>
UNION ALL
SELECT <columns> FROM <tables_or_views>
UNION ALL
-- and so on...
UNION ALL
SELECT <columns> FROM <tables_or_views>
-- note: order by applied at the end to all outputs, not in individual SELECTs
ORDER BY <columns>
Run Code Online (Sandbox Code Playgroud)
如果您使用UNION代替UNION ALL并且查询输出任何重复的行,则这些重复将被过滤,并且只有一个输出。这基本上与DISTINCT涉及排序操作(可能与您通过 应用的排序不匹配)相同的方式完成ORDER BY,对于任何相当大的结果都将涉及到 tempdb 的转储,因此除非您知道可能存在重复项并想要它们过滤掉它更有效,UNION ALL而不是简单的使用UNION。
此外,除非您需要特定的排序,否则请避免指定ORDER BY子句,因为这也可能导致将结果丢弃到 tempdb。
更具体地说,对于您上面包含的查询,我怀疑有一种更简单的方法(来自查询规划器 PoV,因此可能更有效)使用SELECT带有适当GROUPing 和/或窗口函数的single代替多个语句UNIONed。您应该更全面地描述您实际上试图从这段代码中得到什么,并整理包含的代码,使其更具可读性,因为我已经尝试对第一个示例做一点,有人可能会帮助您做到这一点。