【问题标题】:When I join 3 tables in 1 query, I get no results; but when I split them as CTEs I can results?当我在 1 个查询中加入 3 个表时,我没有得到任何结果;但是当我将它们拆分为 CTE 时,我可以得到结果吗?
【发布时间】:2018-05-18 05:09:57
【问题描述】:

当我执行下面的查询时,我没有返回任何结果:

SELECT 
    S.FirstName, S.LastName, S.StudentId, Y8.SectionId
FROM
    SR_Students AS S 
    INNER JOIN
    SR_Student_Classes AS Y7 ON 
        S.StudentId = Y7.StudentId
        AND S.IsActive = 1 AND S.Gender LIKE 'M%'
        AND Y7.TermId = 21 AND Y7.CampusId = 1 AND Y7.ClassId = 7 AND Y7.IsActive = 1
    INNER JOIN
    SR_Student_Classes AS Y8 ON 
        Y7.StudentId = Y8.StudentId
        AND Y8.TermId = 26 AND Y8.CampusId = 7 AND Y7.ClassId = 8 AND Y8.IsActive = 1 

但是,当我将其拆分时(如下所示),我返回了 59 行:

; WITH Y7 AS (
    SELECT S.StudentId, S.FirstName, S.LastName, C.ClassID, C.SectionId, C.TermID, C.CampusId 
    FROM 
        SR_Student_Classes AS C
        INNER JOIN SR_Students AS S ON C.StudentId = S.StudentId
    WHERE 
        C.TermId = 21 AND C.CampusId = 1 AND C.ClassId = 7 AND C.IsActive = 1
        AND S.Gender = 'M' AND S.IsActive = 1
)
, Y8 AS (
    SELECT S.StudentId, S.FirstName, S.LastName, C.ClassID, C.SectionId, C.TermID, C.CampusId 
    FROM 
        SR_Student_Classes AS C
        INNER JOIN SR_Students AS S ON C.StudentId = S.StudentId
    WHERE 
        C.TermId = 26 AND C.CampusId = 7 AND C.ClassId = 8 AND C.IsActive = 1
        AND S.Gender = 'M' AND S.IsActive = 1
)
SELECT 
    Y8.FirstName, Y8.LastName, Y8.StudentId, Y8.SectionId
FROM
    Y7 AS Y7 
    INNER JOIN 
    Y8 AS Y8 ON Y7.StudentId = Y8.StudentId

我知道第二个查询是正确的,因为我知道基础数据。

但是为什么第一个查询不起作用?毕竟,它是使用所有内部连接?

我还尝试将第一个查询的大部分内连接条件移到 WHERE 子句中,没有任何区别(考虑到它们是内连接,我没想到会有任何区别)

【问题讨论】:

  • 您的两个 CTE 所做的事情与原始查询不同。只需将 CTE 代码内联到您的最终选择中,您就会发现查询有很大不同。现在至于你真正想要哪一个,这由你决定。

标签: tsql inner-join common-table-expression


【解决方案1】:

您似乎在第二次加入时打错了。 Y7.ClassId = 8应该是Y8.ClassId = 8

SELECT 
    S.FirstName, S.LastName, S.StudentId, Y8.SectionId
FROM
    SR_Students AS S 
    INNER JOIN
    SR_Student_Classes AS Y7 ON 
        S.StudentId = Y7.StudentId
        AND S.IsActive = 1 AND S.Gender LIKE 'M%'
        AND Y7.TermId = 21 AND Y7.CampusId = 1 AND Y7.ClassId = 7 AND Y7.IsActive = 1
    INNER JOIN
    SR_Student_Classes AS Y8 ON 
        Y7.StudentId = Y8.StudentId
        AND Y8.TermId = 26 AND Y8.CampusId = 7 AND Y8.ClassId = 8 AND Y8.IsActive = 1 

【讨论】:

  • 非常感谢您发现我愚蠢的错字。现在两个脚本都返回相同的结果。真的很感激
猜你喜欢
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多