使用某种类型的联接,返回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
答案 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或订单号。
请注意,如果客户在指定日期之后有多个订单,他/她的名字将不止一次出现在列表中,每次都会有不同的订单号。