當我向第二個子查詢添加別名時,我在 SQL Server 中收到一個語法錯誤。為什么會這樣?有人可以解釋一下嗎?下面是語法錯誤的例子:
訊息 102,級別 15,狀態 1,第 29 行
“s”附近的語法不正確。
這是我的代碼:
SELECT *
FROM
(SELECT 'Fail' [Status],fail_date[Date]
FROM Failed) f
UNION ALL
(SELECT 'Success' [Status],success_date[Date]
FROM Succeeded) s
在第二個子查詢中洗掉別名時,它執行時沒有任何錯誤。對為什么第一個子查詢中允許使用別名而不是第二個子查詢感到困惑。
SELECT *
FROM
(SELECT 'Fail' [Status],fail_date[Date]
FROM Failed) f
UNION ALL
(SELECT 'Success' [Status], success_date[Date]
FROM Succeeded)
uj5u.com熱心網友回復:
TL;DR 答案是表和子查詢別名必須存在于 from 子句中。
我認為實際上是您對括號的使用讓您感到困惑,因為您所做的實際上是嘗試為整個“選擇”設定別名。查詢恰好涉及聯合這一事實并不真正相關。
在失敗的查詢中,您在聯合之后有這種結構:
(select * from MyTable) t; -- invalid, can't have an alias for a whole select.
注意t這里的別名是如何在圍繞整個 select 陳述句的括號之外的。SQL 正在尋找一個from子句:
... from (select * from MyTable) t; -- ok, the alias "t" will be used in the outer "from"
如果別名在括號內,那就沒問題了:
(select * from MyTable t); -- ok, alias is part of the from clause.
當然,應該清楚的是,這個查詢實際上并不需要括號:
select * from MyTable t; -- exactly the same as the previous query
因此,在您的結構失敗的情況下,您有:
select * from (some query) t -- alias is fine, it's used by the outer from clause
union all
(select * from whatever) u -- not ok, can't alias a whole select.
如果你只是洗掉第二組括號,那就沒問題了:
select * from (some query) t
union all
select * from whatever u;
理解這一點的另一種方式是理解查詢第一部分中的“from”子句在聯合處“結束”。聯合之后的選擇是一個全新的選擇陳述句,帶有自己的 from 子句:
select * from MyTable t1 -- this from clause is now done
union all -- we are starting a whole new select, it's not part of the above "from"
select * from MyTable t2
uj5u.com熱心網友回復:
你在我上次查詢中看得更清楚
你工會
SELECT *
FROM
(
SELECT 'Fail' [Status],fail_date[Date]
FROM Failed
) f
和
(
SELECT 'Success' [Status],success_date[Date]
FROM Succeeded
)
UNION 不需要別名,正如您在第一個聯合查詢中看到的那樣
CREATE TABLe Succeeded (success_date date) GO
CREATE TABLe Failed (fail_date date) GO
SELECT * FROM ( SELECT 'Fail' [Status],fail_date[Date] FROM Failed UNION ALL SELECT 'Success' [Status],success_date[Date] FROM Succeeded ) s GO狀態 | 日期 :----- | :---
SELECT * FROM ( SELECT 'Fail' [Status],fail_date[Date] FROM Failed ) f UNION ALL ( SELECT 'Success' [Status],success_date[Date] FROM Succeeded )
GO狀態 | 日期 :----- | :---
SELECT * FROM ( SELECT 'Fail' [Status],fail_date[Date] FROM Failed ) f UNION ALL SELECT 'Success' [Status],success_date[Date] FROM Succeeded GO狀態 | 日期 :----- | :---
db<>在這里小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/343700.html
標籤:sql sql-server 查询语句
上一篇:根據優先級加入和獲取列
下一篇:選擇列更改后的第一行
