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

balp4ylt  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(305)

我正在尝试选择状态为“已完成”的所有笔记。注解存储在自己的表中,在该表中我们有一个注解状态历史记录表,该表具有按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 
   )
iecba09b

iecba09b1#

你似乎想要横向连接:

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,如果你需要的话。 distinct 似乎没有意义,所以我删除了它-你可以添加它回来,如果真的需要一些原因,你没有解释。

u91tlkcl

u91tlkcl2#

可以使用显式 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 似乎是表calld中的主键 Note .

相关问题