当我加入最终表 - SQL 时,数据消失了

  • 本文关键字:SQL 数据 消失了 sql ddl dml
  • 更新时间 :
  • 英文 :


我需要完成此查询,我需要返回在特定日期带来物品的客户的名称以及每件商品的名称。

但是,每当我将客户表连接到其他表时,它基本上都会返回为 NULL。里面肯定有数据。

我已经尝试了一系列不同的连接类型,但似乎没有一种链接并保留客户信息。 我的连接类型似乎有问题...或。

提前感谢团队!

SELECT DISTINCT PM.Name AS [ProductModel Name], P.FirstName AS [Customer Name]
FROM AdventureWorksDB.Production.TransactionHistory TH 
FULL JOIN AdventureWorksDB.Production.Product PP 
ON TH.ProductID = PP.ProductID 
FULL JOIN AdventureWorksDB.Production.ProductModel PM 
ON PP.ProductModelID = PM.ProductModelID
FULL JOIN AdventureWorksDB.Purchasing.ProductVendor PV
ON PP.ProductID = PV.ProductID
FULL JOIN AdventureWorksDB.Purchasing.Vendor V
ON PV.BusinessEntityID = V.BusinessEntityID
FULL JOIN AdventureWorksDB.Person.BusinessEntity BE
ON V.BusinessEntityID = BE.BusinessEntityID
FULL OUTER JOIN AdventureWorksDB.Person.Person P
ON BE.BusinessEntityID = P.BusinessEntityID

WHERE PP.SellStartDate = '2007-07-01'

和输出:


ModelName               |Customer Name
--------------------------------------
All-Purpose Bike Stand  | NULL
Bike Wash               | NULL
Chain                   | NULL
Classic Vest            | NULL
Fender Set - Mountain   | NULL
Front Brakes            | NULL
Front Derailleur        | NULL
Hitch Rack - 4-Bike     | NULL
HL Bottom Bracket       | NULL
...
etc.

WHERE子句中的限制移动到相应连接的ON子句:

SELECT DISTINCT PM.Name AS [ProductModel Name], P.FirstName AS [Customer Name]
FROM AdventureWorksDB.Production.TransactionHistory TH 
FULL JOIN AdventureWorksDB.Production.Product PP
ON TH.ProductID = PP.ProductID AND
PP.SellStartDate = '2007-07-01'
-- rest of your current query

您当前的WHERE子句将筛选出Product表中所有销售开始日期为 2007 年 7 月 1 日的记录。

FULL JOIN

几乎从未被使用过 - 并且几乎从不需要遍历定义良好的适当数据模型。 在这种情况下,这是完全不合适的,因为您需要填写所有列来回答问题。

您正在获得NULL值,因为所有这些值FULL JOINs。 不匹配的行生成NULL值。

我需要返回在特定日期带来物品的客户姓名和每件物品的名称。

因此,请使用INNER JOIN. 仅当一位客户在该日期多次购买同一产品时,才需要SELECT DISTINCT。 我会从一个简单的SELECT开始:

SELECT PM.Name AS [ProductModel Name], P.FirstName AS [Customer Name]
FROM AdventureWorksDB.Production.TransactionHistory TH JOIN
AdventureWorksDB.Production.Product PP 
ON TH.ProductID = PP.ProductID JOIN
AdventureWorksDB.Production.ProductModel PM 
ON PP.ProductModelID = PM.ProductModelID JOIN
AdventureWorksDB.Purchasing.ProductVendor PV
ON PP.ProductID = PV.ProductID JOIN
AdventureWorksDB.Purchasing.Vendor V
ON PV.BusinessEntityID = V.BusinessEntityID JOIN
AdventureWorksDB.Person.BusinessEntity BE
ON V.BusinessEntityID = BE.BusinessEntityID
AdventureWorksDB.Person.Person P
ON BE.BusinessEntityID = P.BusinessEntityID
WHERE PP.SellStartDate = '2007-07-01'

注意:这是使用您在查询中提供的逻辑。 不过,基于这个问题,我希望WHERE条款是:

WHERE CONVERT(DATE, TH.TransactionDate) = '2007-07-01'

最新更新