如何从WHERE子句引用的表中获取行数据

时间:2020-07-27 20:45:59

标签: sql tsql join subquery where-clause

我正在尝试选择状态为已完成的所有笔记。 便笺存储在自己的表中,在该表中,我们具有便笺状态历史记录表,该表具有由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 
   )

2 个答案:

答案 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的表中的主键。