我知道如何从子查询中选择一个字段:
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的等效表单。
答案 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 JOIN
与OUTER JOIN
,并确保了解表之间的关系是否为1..1,1 ... N,等,但一般来说,这是如何从相关表中获取多个字段。