2010-02-09 150 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 
)