嵌套使用JOIN选择,如果不匹配则返回NULL?

时间:2014-04-22 22:10:37

标签: mysql join

我遇到MySQL连接问题,在第一个嵌套的Select查询中偶尔没有实现连接条件,这会导致此查询产生完整的NULL结果。

有人可以告诉我究竟发生了什么吗?无论第一个嵌套选择查询中是否满足join语句的条件,我打算从查询中获取一个值。

SELECT 
(
    SELECT SUM(amount) 
    FROM 
        package_orders
        JOIN packages_products 
        ON package_orders.package_id = package_orders.package_id
    WHERE 
        quote_id =1
    AND rev =1
)
+
(
    SELECT SUM(amount) 
    FROM
        orders
    WHERE 
        quote_id =1
    AND rev =1
) 
AS quote_total

谢谢!

2 个答案:

答案 0 :(得分:1)

NULL+1仍为NULL,因此您必须将第一个SELECTIFNULL(expr1, 0)包装在一起,如下所示:

SELECT IFNULL((
SELECT SUM(amount) 
FROM package_orders
JOIN packages_products ON package_orders.package_id = package_orders.package_id
WHERE quote_id =1
AND rev =1
),0)

+

(
SELECT SUM(amount) 
FROM orders
WHERE quote_id =1
AND rev =1
) 

AS quote_total

答案 1 :(得分:1)

我发现了两个潜在的问题。

如果您的问题只是从packages_products上的package_orders加入返回null,您是否可能正在寻找外部联接?即使没有匹配的package_products,外连接也会返回package_orders。

SELECT (
SELECT SUM(amount) 
FROM package_orders
LEFT JOIN packages_products ON package_orders.package_id = package_orders.package_id
WHERE quote_id =1
AND rev =1
...

或者你的问题是第二个值查询

...
SELECT SUM(amount) 
FROM orders
WHERE quote_id =1
AND rev =1
...

导致整个事物为空?这是因为数字+ null = null。因此,如果第二个查询可能返回null,则需要处理该情况并返回零。

...
IFNULL((SELECT SUM(amount) 
FROM orders
WHERE quote_id =1
AND rev =1), 0)
...

希望这有帮助