繁体   English   中英

带标志条件的左联接查询

[英]Left Join query with flag condition

嗨,我在显示表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

尝试将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标准)。

联接发生后,您的查询正在过滤结果,因此您将过滤出想要保留的内容。 (如果我理解正确)

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

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

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

将其应用于您的问题是微不足道的,留给有兴趣的读者作为练习。 :)

通常,您不需要过滤子查询中的行,优化器将执行此操作,这对于左侧就足够了(或者没有占位符只是A):

    A AS K

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM