这个SQL查询正确吗?I';我使用左外连接
使用联接类型,返回2010年11月1日之后创建的客户记录的名字、姓氏和订单号。仅当该客户已下订单时,才在第3列中包含订单号这个SQL查询正确吗?I';我使用左外连接,sql,join,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'
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
这与内部联接相同。例如:
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'
应该返回相同的结果<当您想要返回客户
时,无论他们是否有相应的订单
记录,都会使用code>LEFT JOIN。如果您只想要有订单的客户,只需使用内部连接即可
正如@Bryan所指出的,你可能想看看如何将你的日期转换为符合你的格式。显示如何根据格式将varchar转换为datetime 左侧外部联接
将为客户
表中的每一行生成一行。这一点在未来几年中可以看得更清楚。使用内部联接
只会为拥有相应订单的客户返回行。如果不进行测试,我认为您不需要“且订单号不为空”
你最终会得到:
FirstName| LastName| OrderNumber
John Smith 1
John Smith 2
Joe Bloggs NULL <-- Joe has no orders
FirstName | LastName | OrderNumber
约翰·史密斯1
约翰·史密斯2
Joe Bloggs NULL这是不正确的,如果没有订单,WHERE条件将评估为false,因此不会包括没有订单的客户(我假设您想要所有客户,因为您写了“仅当该客户下了任何订单时才在第3列中包括订单号。”,因此按照其他人的建议使用内部联接是不正确的)
您可能只想删除o.ordernumber不为空的条件。如果“客户记录”实际上是指“客户订单”,那么您的查询可能如下所示:
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”。您说过:在2010年11月1日之后创建的客户记录
,但在您的查询中,您正在检查Orders.OrderDate列(正如Bryan所清楚地观察到的,也是另一个日期)。这个专栏真的与创建客户记录有关吗?或者“创建客户记录”实际上意味着什么?