2017-02-27 57 views
1

我有一個簡單的SQL語句如下別名所有查詢 - SQL服務器

案例1:

select 1 as a 
union 
select 2 as a 

輸出:此情況下按預期工作

enter image description here

CASE 2:

select 1 as a 
union 
select 2 as b 

輸出:雖然別名在我的第二個選擇中是'b',但它仍然顯示別名'a'。

爲什麼不能使用第二個select語句的別名?

我們如何讓sql從第二個select查詢中選擇別名?

enter image description here

案例3:

select 1 
union 
select 2 as b 

輸出:雖然我的第一選擇上述說法沒有任何別名,但第二個還有,爲什麼結果仍然顯示「無列名'?

enter image description here

+4

這是因爲它是這樣。 – Will

+0

默認情況下,當你在sql中合併數據時,它會從第一個查詢中選擇列名。 – Simon

+1

UNION查詢中的別名系統僅適用於UNION堆棧中的第一個查詢其他所有內容(其他查詢)將被忽略 –

回答

2

你可以換一切的單一SELECT和別名柱周圍你想要的東西。

select a as [b] -- just alias it here with whatever you want 
from (
    select 1 as a 
    union 
    select 2 as b 
    ...) result_set 

但是,正如@威爾所說,它是它是什麼,不能改變這一點。

OR:

只要確保你使用的查詢與您要在頂部和UNION與包含其他查詢單SELECT聲明/值你有「別名」。

select 2 as b 

union 

select a 
from (
    select 1 as a 
    union 
    select 3 as c 
    union 
    ...) result_set 
3

讓我們試着在這裏教一些有用的東西。這不僅僅是It's because that's how it is。有一個模式定義規定了SQL語言的規則,它被稱爲SQL ANSI。你可以在這裏看到這個定義的時間軸:Database Administration - ANSI SQL Standards and Guidelines

這個定義背後的原因很容易理解。由於UNION操作會將兩個查詢的結果轉換爲一個,所以必須應用一些規則,如字段名稱的定義,字段的類型(按順序選擇)以及其他一些規則。

別名部分工作只是第一個,因爲沒有辦法數據庫,以確定哪些列將在聯合操作是正確的,你會得到每個結果一行:

select 1 as a 
UNION 
select 2 

這將導致:

a 
1 
2 

由於它顯示爲行,如果它的名字在UNION堆疊中的每個SQL每一列的數據庫是如何工作的?

-a 
    1 
-b 
    2 

這就是爲什麼應用第一個查詢別名的規則。

SQL ANSI文檔不是免費的,儘管如果您足夠挖掘,您可能會在PDF中找到它的早期版本。祝你好運:)(提示:我有一個工作鏈接我的個人資料中的答案;))

+0

只是爲了讓它更容易找到:http://stackoverflow.com/a/34355862/460557 –