这个SQL查询是否正确?我正在使用左外部连接

问题描述:

使用一种连接类型,返回2010年11月1日之后创建的客户记录的名字,姓氏,订单号。仅当客户已下达任何订单时才在第三列中包含订单号。这个SQL查询是否正确?我正在使用左外部连接

SELECT c.firstname, 
      c.lastname, 
      o.ordernumber 
    FROM Customers c 
LEFT JOIN Orders o ON c.customerid = o.customerid 
    WHERE o.orderdate > '2010-01-01' 
     AND o.ordernumber IS NOT NULL 
+3

请注意,2010年11月1日不是上面写的'2010-01-01'。 – 2011-04-21 05:08:33

+0

@Bryan:+ 1,尼斯找到了。 – 2011-04-21 05:09:52

+0

你说过:'2010年11月1日以后创建的客户记录',但在你的查询中,你正在检查'Orders.OrderDate'列(对于不同的日期,因为Bryan整齐地观察到)。该专栏是否与创建客户记录真正相关?或者“创建客户记录”的含义实际上是什么? – 2011-04-21 07:38:48

这与Inner Join相同。例如:

SELECT c.firstname, 
c.lastname, 
o.ordernumber FROM Customers c 
Inner JOIN Orders o 
ON  c.customerid = o.customerid 
where o. orderdate > '01-01-2010' 

应该返回相同的结果。无论是否有相应的ORDER记录,当您要返回CUSTOMER时使用LEFT JOIN。如果您只希望拥有订单的客户只需使用INNER JOIN

正如@Bryan指出的那样,您可能需要考虑将日期转换为符合您的格式。 This link显示了如何根据格式将varchar转换为日期时间。

LEFT OUTER JOIN将导致Customer表中每行的一行。这可以在wiki article中看到更好。使用INNER JOIN将仅返回具有相应订单的客户的行。

没有测试这个,我认为你不需要“和ordernumber不为空”。

最终你会用:

FirstName| LastName| OrderNumber 
John  Smith  1 
John  Smith  2 
Joe  Bloggs NULL  <-- Joe has no orders 

你所说的“告诉我每个人都和他们的订单如果有人没有任何订单,让他们无论如何。”

这是如果没有订单,则WHERE条件将评估为false,因此没有订单的客户将不会被包含(我假设您希望所有客户,因为您写下了“仅在该客户有第三列时才包括订单号”放置任何订单“,所以使用INNER JOIN作为其他人的建议将是不正确的)。

您可能想要删除o.ordernumber IS NOT NULL条件。

如果“客户记录”你真的意味着“客户订单”,那么也许您的查询应该是这样的:

SELECT c.firstname, 
      c.lastname, 
      o.ordernumber 
    FROM Customers c 
LEFT JOIN Orders o ON c.customerid = o.customerid 
     AND o.orderdate > '2010-01-01' 
        /* or '2010-11-01', if you want Nov 1, 2010 */ 

这将输出所有的客户。第三列将包含NULL或订单号。

请记住,如果客户在给定日期后有多个订单,他/她的名字将相应地出现在列表中多次,每次都有不同的订单号。