0

我正在尝试在 Toad Data Point 中构建查询。我有一个子查询,它有一个行号来标识我感兴趣的记录。只有当行号为 1 时,这个子查询才需要连接到主表上。这是我试图可视化的查询:

SELECT distinct E.EMPLID, E.ACAD_CAREER
FROM PS_STDNT_ENRL E
LEFT JOIN (
  SELECT ACAD_CAREER, ROW_NUMBER() OVER (PARTITION BY ACAD_CAREER ORDER BY EFFDT DESC) as RN
  FROM PS_ACAD_CAR_TBL
) T on T.ACAD_CAREER = E.ACAD_CAREER and RN = 1

当我尝试复制它时,行号条件被放置在全局 WHERE 子句中。这不是预期的功能,因为它有效地删除了子查询中没有匹配的任何记录,使其成为内部连接。

在此处输入图像描述

在此处输入图像描述

这是它生成的查询:

SELECT DISTINCT E.EMPLID, E.ACAD_CAREER, T.RN
  FROM SYSADM.PS_STDNT_ENRL E
       LEFT OUTER JOIN
       (SELECT PS_ACAD_CAR_TBL.ACAD_CAREER,
               ROW_NUMBER ()
                  OVER (PARTITION BY ACAD_CAREER ORDER BY EFFDT DESC)
                  AS RN
          FROM SYSADM.PS_ACAD_CAR_TBL PS_ACAD_CAR_TBL) T
          ON (E.ACAD_CAREER = T.ACAD_CAREER)
 WHERE (T.RN = 1)

有没有办法让查询生成器将该行号条件放在左连接而不是全局 WHERE 子句上?

4

1 回答 1

0

我找到了一种让它工作的方法。

  1. 向主表添加一个值为 1 的计算字段。

在此处输入图像描述

  1. 将行号连接到这个新的计算字段。

在此处输入图像描述

现在查询在连接条件而不是 WHERE 子句中有过滤器,以便它按预期连接。这是它提出的查询:

SELECT DISTINCT E.EMPLID, E.ACAD_CAREER, T.RN
  FROM SYSADM.PS_STDNT_ENRL E
       LEFT OUTER JOIN
       (SELECT PS_ACAD_CAR_TBL.ACAD_CAREER,
               ROW_NUMBER ()
                  OVER (PARTITION BY ACAD_CAREER ORDER BY EFFDT DESC)
                  AS RN
          FROM SYSADM.PS_ACAD_CAR_TBL PS_ACAD_CAR_TBL) T
          ON (E.ACAD_CAREER = T.ACAD_CAREER) AND (1 = T.RN)
于 2016-06-20T16:35:07.293 回答