SQL:我如何引用先前查询的结果?

Dan*_*don 5 sql sql-server-2008

假设我有一个如下所示的SQL查询:

SELECT fName from employees where ssn=123456789;
Run Code Online (Sandbox Code Playgroud)

假设我想跟随另一个查询:

SELECT fName from records WHERE ssn=123456789;
SELECT lName from records WHERE fName=(the result of the previous query)
Run Code Online (Sandbox Code Playgroud)

(the result of the previous query)为了使fName与ssn = 123456789的大概唯一记录相匹配的记录,我该怎么做才能返回姓氏?

我知道这是一个不切实际的例子,但我要问的是,"我如何参考我之前查询的结果?"

顺便说一句,如果它有任何区别,我正在使用MS SQL Server 2008.谢谢!

Mat*_*nes 7

您可以将第一个查询的结果保存到变量中,并在第二个查询中使用该变量.

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

SELECT lName from records WHERE fName=@firstName
Run Code Online (Sandbox Code Playgroud)


a1e*_*x07 5

SELECT lName from records WHERE fName =(SELECT fName from employees where ssn=123456789)
Run Code Online (Sandbox Code Playgroud)

要么

 SELECT lName from records r
 INNER JOIN employees e ON (e.fName = r.fName)
 WHERE e.ssn = 123456789
Run Code Online (Sandbox Code Playgroud)

或者您也可以使用CTE.


Dav*_*all 5

有三种明显的方法可以做到这一点。您可以使用SQL变量,临时表(或表变量,它们大致等效),也可以使用子查询。

SQL变量

在这里,您将所需的值存储在变量中(下面的@fname代码段),然后可以稍后使用。使用这种方法时,您需要注意,SSN实际上是唯一的标识。

Declare @fname Varchar(50)

Select @fname = fname 
from employees 
Where ssn = 123456789

Select lName from records
where fname = @fname
Run Code Online (Sandbox Code Playgroud)

临时表

使用临时表,您可以创建所需记录的表。然后可以在以后使用它,并在子查询中使用临时表获取所需的记录。

您可以将临时表声明为单独的create table语句,也可以像下面所做的那样将其声明为选择的一部分。

Select fname into #temptable
From employees
Where ssn = 123456789

Select lName from records
where fname in 
(
    Select fname 
    from #temptable
)
Run Code Online (Sandbox Code Playgroud)

子查询

实际上,这与临时表方法非常相似,但是您内嵌了临时表部分,因此以后就无法再次引用它。

Select @fname = fname 
from employees 
Where ssn = 123456789

Select lName from records
where fname in 
(
   Select fname 
   from employees 
   Where ssn = 123456789 
)
Run Code Online (Sandbox Code Playgroud)