与相同的2个表的子查询相比,具有2个表的内部联接查询给出的结果与子查询相比有所不同

时间:2019-05-14 18:05:41

标签: sql-server subquery northwind

使用Northwind数据库= 2个表=订单和客户。需要获得1997年下订单的公司(OrderDate)。

订单表数据:

OrderID CustomerID  EmployeeID  OrderDate   RequiredDate    ShippedDate ShipVia Freight ShipName    ShipAddress ShipCity    ShipRegion  ShipPostalCode  ShipCountry

客户表数据:

CustomerID  CompanyName ContactName ContactTitle    Address City    Region  PostalCode  Country Phone   Fax

我运行了2个查询,一个是内部联接,另一个是子查询。内部联接查询提供408行的输出,而子查询提供86行的输出。我觉得子查询将CustomerID组合在一起。不确定哪个查询对这个问题是正确的,以使公司在1997年下订单

内部联接查询

Select a.OrderID, a.CustomerID, b.CompanyName,a.OrderDate
from Orders a
inner join Customers b on a.CustomerID = b.CustomerID
where a.OrderDate between '1997-01-01' AND '1997-12-31'

SUB查询

SELECT CustomerID, CompanyName
FROM Customers
WHERE CustomerID IN (SELECT CustomerID
            FROM Orders
            WHERE OrderDate BETWEEN '1997-01-01' AND '1997-12-31');

我正在提高自己的SQL技能,并且正在使用Northwind数据库进行练习,因此想知道哪个查询是正确的答案

1 个答案:

答案 0 :(得分:3)

这就是您要返回的内容。在子查询示例中,您仅返回客户表中在子查询中具有订单的行-因此每个客户一行。 在内部联接示例中,您将同时从“客户”表和“订单”表中返回数据-因此,每个客户和每个订单一行。

如果客户有5个订单,则子查询示例将为客户返回一行。在内部联接示例中,查询将返回5行-客户已下订单的每一行。

这可能有助于进一步解释内部联接逻辑:https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/inner-join-operation-microsoft-access-sql