从SQL Server中的子查询中选择多个列

时间:2016-02-15 14:51:04

标签: sql-server subquery

我知道如何从子查询中选择一个字段:

SELECT 
    ID, fck, f1, 
    (SELECT f2 FROM tbl2 Y WHERE Y.ID = T.fck) AS f2
FROM 
    tbl1 T

如果我需要从子查询中选择两列,实际上我会这样做:

SELECT 
    ID, fck, f1, 
    (SELECT f2 FROM tbl2 Y WHERE Y.ID = T.fck) AS f2, 
    (SELECT f3 FROM tbl2 Y WHERE Y.ID = T.fck) AS f3
FROM 
    tbl1 T

有一种方法可以避免两个子查询?类似的东西:

SELECT 
    ID, fck, f1, 
    (SELECT f2, f3 FROM tbl2 Y WHERE Y.ID = T.fck) AS f2, f3
FROM 
    tbl1 T

数据库是SQL Server 2008 R2。

我知道这个简单的例子可能会使用JOIN重写,但有些情况下没有使用JOIN的等效表单。

2 个答案:

答案 0 :(得分:14)

您可以使用SELECT t1.ID, t1.fck, t1.f1, t3.f2, t3.f3 FROM tbl1 AS t1 OUTER APPLY ( SELECT f2, f3 FROM tbl2 AS t2 WHERE t2.ID = t1.fck) AS t3

SELECT

.t3x子句包含标量值,因此无法处理返回多于字段的子查询或一个字段的多个记录。

答案 1 :(得分:2)

相关子查询用于获取单个值,但您只需将子查询转换为连接即可执行所需操作:

SELECT T.ID, T.fck, T.f1, Y.f2, Y.f3
FROM tbl1 T
INNER JOIN tbl2 Y ON Y.ID = T.fck

与任何联接一样,您还需要确定是否需要INNER JOINOUTER JOIN,并确保了解表之间的关系是否为1..1,1 ... N,等,但一般来说,这是如何从相关表中获取多个字段。