左连接查询与标志条件

时间:2015-06-25 02:31:05

标签: mysql sql left-join

Hy,我有问题显示表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

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

2 个答案:

答案 0 :(得分:1)

尝试将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 ;

我还修改了查询以使用表别名(更容易编写和读取查询)并使用COALESCE()代替ISNULL()COALESCE()是ANSI标准)。

答案 1 :(得分:1)

您的查询是在加入发生后过滤结果,因此您将过滤掉您想保留的内容。 (如果我理解正确的话)

相反,你总是可以做子查询:

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

这样,您可以在加入表格之前过滤掉所需的行。

将此问题应用于您的问题是微不足道的,并留作感兴趣的读者的练习。 :)

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

    A AS K