加入多个表格和视图
SELECT dbo.Monitor_Request.WorkDesc
, dbo.Monitor_Request.Request_ID
, dbo.Monitor_Request.Due_Dt
, dbo.Monitor_Request.Attempts
, dbo.Monitor_Request.Status_Ind
, dbo.Monitor_Request.Create_Dt
, dbo.Monitor_Request.Monitor_ID
, dbo.Monitor_Request.ByCustomer_ID
, dbo.Monitor_Request.ByCompanyID
, dbo.CompanyShim.Company_Name
, dbo.PostalAddressShim.HouseName
, dbo.PostalAddressShim.Street
, dbo.PostalAddressShim.Town
, dbo.PostalAddressShim.City
, dbo.PostalAddressShim.County
, dbo.PostalAddressShim.Postcode
FROM dbo.PostalAddressShim
RIGHT OUTER JOIN dbo.CompanyShim ON dbo.PostalAddressShim.Address_ID = dbo.CompanyShim.Company_Address_ID
RIGHT OUTER JOIN dbo.CUSTOMER ON dbo.PostalAddressShim.Address_ID = dbo.CUSTOMER.Address_ID
RIGHT OUTER JOIN dbo.Monitor_Request ON dbo.CUSTOMER.Customer_ID = dbo.Monitor_Request.ByCustomer_ID
AND dbo.CompanyShim.Company_ID = dbo.Monitor_Request.ByCompanyID
我创建了一个显示客户详细信息及其地址的视图。 客户可以是个人或公司。 它们存储在不同的表格中。 对于个人而言,详细信息存储在名为Customer的表中,公司详细信息存储在Company表中。 我试图创建一个数据库中所有客户的视图来显示他们的地址。 当我单独加入表格时,我会收到地址详细信息,但如果我同时加入两个表格(客户和公司),则不会为地址详细信息列获取空值。
如何从数据库中获取客户(个人或公司)的所有地址详细信息
我很少发现需要使用RIGHT OUTER JOIN
,每次遇到它时,都会迫使我思考从右到左的复杂事情。
如果我没有严重混淆,下面的连接应该和你写的一样
SQL语句
dbo.Monitor_Request mr
LEFT OUTER JOIN dbo.Customer c ON c.Customer_ID = mr.ByCustomerID
LEFT OUTER JOIN dbo.CompanyShim cs ON cs.Company_ID = mr.ByCompanyID
LEFT OUTER JOIN dbo.PostalAddressShim pas ON pas.Address_ID = c.Address_ID
AND pas.Address_ID = cs.Company_Address_ID
现在这是我可以阅读和推理的内容。 从这个陈述中可以明显看出, AND
条款在加入与客户和公司有效的地址方面有效否定对方,并且根本没有返回任何地址。
我的猜测是你应该简单
LEFT JOINS
替换你的RIGHT JOINS
OR
而不是AND
SQL语句
dbo.Monitor_Request mr
LEFT OUTER JOIN dbo.Customer c ON c.Customer_ID = mr.ByCustomerID
LEFT OUTER JOIN dbo.CompanyShim cs ON cs.Company_ID = mr.ByCompanyID
LEFT OUTER JOIN dbo.PostalAddressShim pas ON pas.Address_ID = c.Address_ID
OR pas.Address_ID = cs.Company_Address_ID
乍一看,尝试将您的RIGHT OUTER JOIN
更改为LEFT OUTER JOIN
。