带标志条件的左连接查询

Left Join query with flag condition

嗨,我在显示 table cash 的所有行时遇到问题,如果该列没有数据,我会尝试获取 cashassignment_id 列然后打印 Unallocated 作为结果。但是 Cash 1 不见了。

我的sql:

SELECT  
    cash.cash_id,
    cash.cash_name,
    IFNULL(cash_assignments.cashassignment_id, 'Unallocated') AS cashassignment_id
FROM cash
    LEFT JOIN cash_assignments USING(cash_id)
WHERE cash_assignments.cashassignment_valid = TRUE OR cash_assignments.cashassignment_valid IS NULL

演示Link http://sqlfiddle.com/#!9/ce446/1/0

尝试将 where 条件移动到 on 子句:

SELECT c.cash_id, c.cash_name,
       COALESCE(ca.cashassignment_id, 'Unallocated') AS cashassignment_id
FROM cash c LEFT JOIN
     cash_assignments ca
     ON c.cash_id = ca.cash_id AND ca.cashassignment_valid = TRUE ;

我还修改了查询以使用 table 别名(更易于编写和读取查询)并使用 COALESCE() 而不是 ISNULL()COALESCE() 是 ANSI标准)。

您的查询在连接发生后过滤结果,因此您将过滤掉您想要保留的内容。 (如果我没理解错的话)

相反,您始终可以执行子查询:

SELECT K.X, L.Y FROM
    (SELECT X FROM A) AS K
LEFT JOIN
    (SELECT Y FROM B) AS L
USING (SOME_ID)

您可以在子查询中添加 where 子句:

    (SELECT Y FROM B WHERE SOMECOND) AS L

这样您就可以在加入表格之前过滤出您需要的行。

将此应用于您的问题是微不足道的,留给感兴趣的人作为练习 reader。 :)

通常你不需要过滤子查询中的行,optmizer 会这样做,这对左侧就足够了,(或者没有占位符只是 A):

    A AS K