我正在尝试选择状态为已完成的所有笔记。 便笺存储在自己的表中,在该表中,我们具有便笺状态历史记录表,该表具有由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
)
答案 0 :(得分: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
似乎没有任何意义,因此我将其删除-如果出于某些原因(您没有解释)确实需要将其添加回去。
答案 1 :(得分:0)
您可以使用显式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
的表中的主键。