Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个SQL查询正确吗?I';我使用左外连接_Sql_Join - Fatal编程技术网

这个SQL查询正确吗?I';我使用左外连接

这个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'

使用联接类型,返回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

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

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所清楚地观察到的,也是另一个日期)。这个专栏真的与创建客户记录有关吗?或者“创建客户记录”实际上意味着什么?