这个SQL查询是否正确?我正在使用LEFT OUTER JOIN

时间:2011-04-21 05:04:05

标签: sql join

使用某种类型的联接,返回2010年11月1日之后创建的客户记录的名字,姓氏,订单号。仅当该客户下了任何订单时,才在第3列中包含订单号。

   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

5 个答案:

答案 0 :(得分:1)

这与内部联接相同。例如:

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'

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

正如@Bryan指出的那样,您可能希望转换您的日期以匹配您的格式。 This link显示了如何根据格式将varchar转换为日期时间。

答案 1 :(得分:0)

LEFT OUTER JOIN将为Customer表中的每一行生成一行。在wiki article中可以更好地看到这一点。使用INNER JOIN只会为拥有相应订单的客户返回行。

答案 2 :(得分:0)

如果不对此进行测试,我认为您不需要“并且ordernumber不为空”。

你最终会得到:

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

你所说的是“告诉我每个人及他们的命令。如果有人没有任何命令,无论如何都要出示”

答案 3 :(得分:0)

这是不正确的,如果没有订单,WHERE条件将评估为false,因此不会包含没有订单的客户(我假设您想要所有客户,因为您写了“在第3列中包含订单号”只有当该客户下了任何订单。“,所以使用INNER JOIN和其他人建议的那样是不正确的。”

您可能只想放弃o.ordernumber IS NOT NULL条件。

答案 4 :(得分:0)

如果通过“客户记录”确实表示“客户订单”,那么您的查询可能如下所示:

   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或订单号。

请注意,如果客户在指定日期之后有多个订单,他/她的名字将不止一次出现在列表中,每次都会有不同的订单号。