6

追逐我的尾巴试图弄清楚这一点,谷歌搜索它只会导致更复杂的例子。

我已经加入了两个表,可以正常加入。教授要求我们列出订单表中发货日期为 NULL 的行,或者用练习的话来说,“尚未发货的订单”。

加入工作正常,直到我添加 IS NULL 行,然后我得到错误: Msg 156, Level 15, State 1, Line 13 关键字'LEFT'附近的语法不正确。

我已经用 20 种不同的方式编写了这本书,并花了一个下午在谷歌上搜索它,但无法摆脱错误。我知道这会很简单,但是...

SELECT
    customers.customer_id,
    customers.name,
    customers.phone,
    orders.order_id,
    orders.order_date,
    orders.shipped_date
FROM
    orders
WHERE
    orders.shipped_date IS NULL
LEFT OUTER JOIN customers ON customers.customer_id=orders.customer_id
4

3 回答 3

20

有一个如何编写查询的定义顺序

select
from
join
where
group by
having
order by

您不能混合该顺序。

于 2012-12-12T00:08:49.083 回答
5

LEFT JOIN应该在WHERE从句之前。

SELECT  customers.customer_id,
        customers.name,
        customers.phone,
        orders.order_id,
        orders.order_date,
        orders.shipped_date
FROM    orders 
        LEFT OUTER JOIN customers 
            ON customers.customer_id=orders.customer_id
WHERE   orders.shipped_date IS NULL

有关联接的更多信息,请参阅

于 2012-12-12T00:06:55.717 回答
0

为了澄清 LEFT JOIN,“LEFT”侧的每条记录(来自源),无论右侧的匹配项(连接到)

所以,如果你要交换,例如,给我所有的客户,不管有没有订单,你会做类似的事情

Select
      C.Customer_ID,
      C.Name,
      C.Phone,
      O.Order_Date
   from
      Customers C
         LEFT JOIN Orders O
            on C.Customer_ID = O.Customer_ID

将显示所有客户,如果存在订单,也会显示该日期。

您要查找的只是所有尚未发货的订单以及订单的对象的列表。这将是一个standers INNER JOIN,因为您期望双方都存在匹配。

Select
      C.Customer_ID,
      C.Name,
      C.Phone,
      O.Order_Date
   from 
      Orders O
         INNER JOIN Customers C
            on O.Customer_ID = C.Customer_ID
   where
      O.Shipped_Date IS NULL

因此,本例中的 WHERE 子句显式位于主“FROM”表源“Orders”(别名为“O”)上。而且你只想要那些没有发货的,因此只关心 O.Shipped_Date 是 NULL

于 2012-12-12T00:13:03.253 回答