【问题标题】:How to get Row Data from the table referenced by the WHERE clause如何从 WHERE 子句引用的表中获取行数据
【发布时间】:2020-11-17 06:09:15
【问题描述】:
我正在尝试选择所有状态为已完成的笔记。
便笺存储在自己的表中,我们有一个便笺状态历史表,其中包含 noteId 的外键关系。如何从 WHERE 子句 (t2) 中引用的表中获取数据,以使我不必为了获取 CompletedBy 的数据而再次循环遍历结果。
SELECT DISTINCT
t1.NoteId,
t2.CompletedBy-- error
FROM
Note t1
WHERE
EXISTS
(
SELECT
TOP 1 *
FROM
NoteStatus t2
WHERE
t1.NoteId = t2.NoteId
AND t2.Completed = 1
)
【问题讨论】:
标签:
sql
tsql
join
subquery
where-clause
【解决方案1】:
您可以使用显式的join 或者——更简单地说——横向连接:
SELECT n.NoteId, ns.CompletedBy-- error
FROM Note n CROSS APPLY
(SELECT TOP 1 ns.*
FROM NoteStatus ns
WHERE ns.NoteId = n.NoteId AND
ns.Completed = 1
);
我不确定你为什么需要SELECT DISTINCT,所以我删除了它。名为NoteId 的列看起来确实像是名为Note 的表中的主键。
【解决方案2】:
您似乎想要横向连接:
select n.noteId, ns.completedBy
from note n
cross apply (
select top (1) *
from notestatus ns
where ns.noteId = n.noteId and ns.completed = 1
) ns
您可以使用相关子查询获得相同的结果 - 但横向连接让您有机会从 notestatus 表中返回更多列,如果您需要的话。
distinct 似乎没有意义,因此我将其删除 - 如果出于某种您未解释的原因确实需要它,您可以将其添加回来。