如何从 WHERE 子句引用的 table 中获取行数据
How to get Row Data from the table referenced by the WHERE clause
我正在尝试 select 所有状态为已完成的笔记。
笔记存储在自己的 table 中,我们有一个笔记状态历史记录 table 与 noteId 的外键关系。我怎样才能从 WHERE 子句 (t2) 中引用的 table 获取数据,而不必再次循环结果以获取 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
)
您可以使用显式 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
的列确实看起来像是 table 调用中的主键 Note
.
您似乎想要横向连接:
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
table 中获得 return 更多列,如果您需要的话.
distinct
似乎没有意义,所以我删除了它 - 如果由于某些您没有解释的原因确实需要它,您可以将其添加回来。
我正在尝试 select 所有状态为已完成的笔记。 笔记存储在自己的 table 中,我们有一个笔记状态历史记录 table 与 noteId 的外键关系。我怎样才能从 WHERE 子句 (t2) 中引用的 table 获取数据,而不必再次循环结果以获取 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
)
您可以使用显式 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
的列确实看起来像是 table 调用中的主键 Note
.
您似乎想要横向连接:
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
table 中获得 return 更多列,如果您需要的话.
distinct
似乎没有意义,所以我删除了它 - 如果由于某些您没有解释的原因确实需要它,您可以将其添加回来。