如何从子查询中为主查询添加额外列并保留原有筛选条件?
改写后的查询语句
要保留原查询的所有筛选逻辑,同时获取指定列,正确的LEFT JOIN写法如下:
SELECT s.ACCOUNT_NUMBER, s.Panel, s.List, e.code, e.pmo, e.date, e.status FROM `dataset1.split_list` s LEFT JOIN `dataset2.enroll` e ON s.ACCOUNT_NUMBER = e.bill_acc AND e.code IN ('50', '103', '107') AND e.pmo IN ('55F', 'GG2', 'LL1', 'SS0') AND e.date >= '2023-05-22' WHERE s.Panel = 'C2' AND s.List = '504' AND e.bill_acc IS NULL
错误原因分析
你之前用LEFT JOIN得到错误结果,大概率是把dataset2.enroll的筛选条件(code、pmo、date)放到了WHERE子句中,而非JOIN的ON子句里。如果这么做,原本LEFT JOIN返回的无匹配行(e列全为NULL)会被WHERE里的e列条件过滤掉,逻辑直接变成INNER JOIN,完全偏离了原查询"ACCOUNT_NUMBER NOT IN 子查询"的语义。
把enroll的筛选条件放到ON子句中,才能确保只关联符合条件的enroll记录,同时保留split_list中没有匹配的行,再通过e.bill_acc IS NULL筛选出原查询要求的"不在子查询结果中"的账号。
内容的提问来源于stack exchange,提问作者Bilka
相关产品推荐
相关产品推荐

