在哪里使用临时表

时间:2013-09-19 12:53:27

标签: sql join where

我有三个表:客户,订单和退款。一些客户(并非所有客户)下订单,而某些订单(不是全部)则有退款。

当我加入这样的三个表时(细节并不重要):

SELECT ...
FROM customers LEFT JOIN orders
ON customers.customer_id=orders.customer_id    
LEFT JOIN refunds
ON orders.order_id=refunds.order_id;
//WHERE order_id IS NOT NULL;// uncomment to filter out customers that have no orders

我得到一张大桌子,其中列出了所有客户(即使是那些没有下订单并且'order_id'栏中有NULL的人),他们的所有订单和订单的退款(即使不是全部)订单退款):

NAME     ORDER_ID    ORDER AMOUNT   REFUND
------------------------------------------------------------
Natalie   2         12.50           NULL
Natalie   3         18.00           18.00
Brenda    4         20.00           NULL
Adam      NULL      NULL            NULL    

由于我只想查看已下订单的客户,即在这种情况下我想从表中过滤Adam,我从上面的SQL查询中取消注释'WHERE'行。 这产生了期望的结果。 我的问题是: 在哪个表上执行了WHERE - 在原始'orders'表(没有order_id为NULL)上或在JOINs结果的表上? 显然它是后者,但只是想确保,因为它从SQL语法中不是很明显,这是非常重要的一点。

谢谢

3 个答案:

答案 0 :(得分:0)

在这种情况下,您的SQL工作比以前更难。它正在对结果进行操作(可能是MERGE事件,或类似的事情)。

SQL有可能意识到您正在做的事情并优化计划并为您更改为INNER JOIN。但我无法确定(SQL也不能 - 它可以改变它随时间优化的方式)。

如果您只想订购订单,请改用INNER JOIN。 SQL在这方面会更有效率。

SELECT ...
FROM customers
INNER JOIN orders
ON customers.customer_id=orders.customer_id    
LEFT JOIN refunds
ON orders.order_id=refunds.order_id;

答案 1 :(得分:0)

您可以将LEFT JOIN更改为INNER JOIN,以消除没有订单的客户

SELECT ...
FROM customers INNER JOIN orders
ON customers.customer_id=orders.customer_id    
LEFT JOIN refunds
ON orders.order_id=refunds.order_id;

答案 2 :(得分:0)

这是因为您正在使用LEFT JOIN,它将返回左侧表中的所有行,在您的情况下,这是Customer表,并返回NULL,其中没有相应的值出现在右侧表格中。

只需使用内部联接重写它,因此只返回找到匹配数据的行。

SELECT ...
FROM customers 
INNER JOIN orders
    ON customers.customer_id=orders.customer_id    
INNER JOIN refunds
    ON orders.order_id=refunds.order_id;