带标志条件的左连接查询
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
尝试将 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
嗨,我在显示 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
尝试将 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