关键字'LEFT'附近的语法不正确

时间:2012-12-12 00:06:15

标签: sql database sql-server-2008

追逐我的尾巴试图解决这个问题,谷歌搜索它只会导致更复杂的例子。

我加入了两张桌子,加入很好。教授要求我们列出订单表中的发货日期为NULL的行,或者在练习的单词中列出“尚未发货的订单”。

加入工作正常,直到我添加IS NULL行,然后我得到错误: 消息156,第15级,状态1,第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

3 个答案:

答案 0 :(得分:14)

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

select
from
join
where
group by
having
order by

你不能混合那个命令。

答案 1 :(得分:4)

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

有关联接的其他信息,请参阅

答案 2 :(得分:0)

澄清LEFT JOIN,“LEFT”侧(来自源)的每条记录,无论右侧是否匹配(加入)

所以,例如,如果您是SWAP,请告诉我所有客户,无论是否存档,您都可以这样做

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

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

您要查找的只是尚未发货的所有订单的清单以及订单的订单。这将是一个标准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