这个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
答
这与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转换为日期时间。
答
没有测试这个,我认为你不需要“和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或订单号。
请记住,如果客户在给定日期后有多个订单,他/她的名字将相应地出现在列表中多次,每次都有不同的订单号。
请注意,2010年11月1日不是上面写的'2010-01-01'。 – 2011-04-21 05:08:33
@Bryan:+ 1,尼斯找到了。 – 2011-04-21 05:09:52
你说过:'2010年11月1日以后创建的客户记录',但在你的查询中,你正在检查'Orders.OrderDate'列(对于不同的日期,因为Bryan整齐地观察到)。该专栏是否与创建客户记录真正相关?或者“创建客户记录”的含义实际上是什么? – 2011-04-21 07:38:48