【问题标题】: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 似乎没有意义,因此我将其删除 - 如果出于某种您未解释的原因确实需要它,您可以将其添加回来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-09
        • 2020-07-18
        • 2010-10-04
        • 2021-06-24
        • 2019-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多