如何查询左连接后新表中的NULL列?(DataLemur问题)
如何筛选左连接后liked_date为NULL的行?
我正在解决一道SQL题,执行左连接后得到了包含重复列的结果表,现在需要筛选出其中liked_date列为NULL的行,但不知道怎么正确引用连接后的结果。我的初始查询语句如下:
SELECT * FROM pages p LEFT JOIN page_likes pl ON p.page_id = pl.page_id
查询结果里有重复的page_id列,部分行的liked_date等字段为NULL。我考虑用CTE给连接结果表设置别名,但不确定这种方式是否正确,想知道怎么正确引用liked_date列并判断它是否为NULL?
方法1:直接在WHERE子句中过滤
不需要额外给连接结果设别名,直接通过表别名pl引用liked_date列即可,这样还能避免同名字段的混淆:
SELECT p.page_id, p.page_name FROM pages p LEFT JOIN page_likes pl ON p.page_id = pl.page_id WHERE pl.liked_date IS NULL;
别用SELECT *,因为会返回两个page_id列(分别来自pages和page_likes),明确指定需要的字段更清晰,也符合题目的输出需求。
方法2:用CTE包装连接结果
如果需要把连接逻辑封装起来,CTE是完全可行的方式,写法如下:
WITH joined_pages AS ( SELECT p.page_id, p.page_name, pl.liked_date FROM pages p LEFT JOIN page_likes pl ON p.page_id = pl.page_id ) SELECT page_id, page_name FROM joined_pages WHERE liked_date IS NULL;
这种方式适合逻辑更复杂的场景,让代码结构更清晰。
关键说明
- 左连接后,
pl.liked_date IS NULL等价于该页面没有对应的点赞记录,正好匹配“无点赞页面”的查询需求。 - 避免
SELECT *是因为当表存在同名字段时,返回的重复列可能导致后续处理出错,明确指定字段是更规范的SQL写法。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

