2010-02-09 151 views
3

假設我有一個SQL查詢,看起來像這樣:SQL:我如何引用先前查詢的結果?

SELECT fName from employees where ssn=123456789; 

假設我要遵循另一個前面的查詢:

SELECT fName from records WHERE ssn=123456789; 
SELECT lName from records WHERE fName=(the result of the previous query) 

我怎麼把在(the result of the previous query)使這個回報fname匹配大概唯一的記錄,其中ssn = 123456789的記錄的姓氏?

我知道這是一個不切實際的例子,但我問的是,「我如何引用我以前的查詢結果?」

順便說一句,如果它有什麼區別,我使用MS SQL Server 2008.謝謝!

+2

你對此有什麼實際用途?你是否真的需要**將它分成兩個查詢? – Romain 2010-02-09 22:35:54

+0

這不是我正在做的事情的例子。我只是簡單地使用這些語句來提出問題:「當我編寫查詢時,如何引用上一個查詢的結果?」 我知道我已經看到了這個地方,但嘗試,因爲我可能,我似乎無法再找到它... – 2010-02-09 22:39:20

+0

加入,子查詢,變量,CTE,交叉應用,臨時表大致在這個順序! – 2010-02-09 22:52:28

回答

7

您可以將第一個查詢的結果保存到一個變量中,並在第二個查詢中使用該變量。

DECLARE @firstName VARCHAR(255) 
SELECT @firstName = fName from employees where ssn=123456789 

SELECT lName from records WHERE [email protected] 
5
SELECT lName from records WHERE fName =(SELECT fName from employees where ssn=123456789) 

OR

SELECT lName from records r 
INNER JOIN employees e ON (e.fName = r.fName) 
WHERE e.ssn = 123456789 

,或者您也可以使用CTE。

4

有三種明顯的方法可以做到這一點。您可以使用SQL變量,臨時表(或表變量,它們大致相同),也可以使用子查詢。

SQL變量

這裏您存儲所需的值的變量(@fname一塊下面的代碼),然後你可以在以後用這個。通過這種方法,你要小心你的SSN確實是唯一的標識符。

Declare @fname Varchar(50) 

Select @fname = fname 
from employees 
Where ssn = 123456789 

Select lName from records 
where fname = @fname 

臨時表

有了一個臨時表創建的,你想記錄的表。這可以稍後使用,並獲取您想要的記錄,然後在子查詢中使用臨時表。

您可以聲明臨時表作爲一個單獨的create table聲明,或聲明它爲您選擇的一部分,我做以下。

Select fname into #temptable 
From employees 
Where ssn = 123456789 

Select lName from records 
where fname in 
(
    Select fname 
    from #temptable 
) 

子查詢

這其實是頗爲相似,臨時表的做法,但你內聯臨時表中的一部分,所以你不能再引用它以後。

Select @fname = fname 
from employees 
Where ssn = 123456789 

Select lName from records 
where fname in 
(
    Select fname 
    from employees 
    Where ssn = 123456789 
)