如何在使用左连接之前过滤第一个表

时间:2016-10-28 02:42:36

标签: sql-server tsql where

我有这段代码:

SELECT 
    c.ChapterNo, l.LessonNo 
FROM 
    Chapter c LEFT JOIN Lesson l ON c.ChapterNo = l.ChapterNo

返回章节表中的所有行,即使在课程表中没有类似的值。

我想要做的是按照描述'几何'来过滤章节表。在使用left join之前。我在代码之后使用了where - 子句:

SELECT 
    c.ChapterNo, l.LessonNo 
FROM 
    Chapter c LEFT JOIN Lesson l ON c.ChapterNo = l.ChapterNo 
WHERE 
    c.desc = 'geometry'

但它不会返回任何内容。

另外,我正在编写与VB.NET中的程序连接的SQL代码。

2 个答案:

答案 0 :(得分:3)

如果您正在使用Sql Server,就像您发布的那样,您不应该遇到区分大小写的问题。您的查询是正确的,您必须没有c.desc = 'geometry'

的章节

您还询问了如何在加入之前过滤查询。您可以使用内联查询

来完成
SELECT 
    c.ChapterNo, l.LessonNo 
FROM 
    (SELECT * FROM Chapter WHERE c.desc = 'geometry') c 
    LEFT JOIN Lesson l ON c.ChapterNo = l.ChapterNo 

这样你就可以在加入前真正过滤章节了。但是,DBMS优化器如何执行它。可能与原始查询的方式相同 - 请参阅解释计划

答案 1 :(得分:2)

请试试这个。

SELECT 
    c.ChapterNo, l.LessonNo 
FROM 
    Chapter c 
LEFT JOIN Lesson l ON c.ChapterNo = l.ChapterNo AND c.desc = 'geometry'

这将匹配'geometry',剩余将为NULL