[英]Better way to inner join tables where value in 1 table OR another table
[英]Is there a better way to join several tables rather than user 'INNER JOIN'
我正在寫一個查詢以從八個表中獲取50列。 只是出於好奇,還有比在inner join Table A on Table B.orderNumber = Table A.OrderNumber
使用一系列inner join Table A on Table B.orderNumber = Table A.OrderNumber
更好的方法來獲取數據,而不是對表AH inner join Table A on Table B.orderNumber = Table A.OrderNumber
?
運行該數據庫的是SQL Server 2008。
這是我仍在寫的初始查詢:
SELECT
/*Buyer and Seller information for order number */
[QCV_BuyerSellers].[OrderNumber] AS OrderNum
,[QCV_BuyerSellers].[OrderGuid] AS Order_GUID
,[QCV_BuyerSellers].[Buyer1_EntityTypeId] AS ENT_TYPE
,[QCV_BuyerSellers].[Buyer1_EntityTypeName] AS ENT_TYPE_NAME
,[QCV_BuyerSellers].[Buyer1_FullName] AS FULL_NAME
,[QCV_BuyerSellers].[Buyer1_FirstName] AS BF_Name
,[QCV_BuyerSellers].[Buyer1_MiddleName] AS BM_Name
,[QCV_BuyerSellers].[Buyer1_LastName] AS BL_Name
,[QCV_BuyerSellers].[Buyer1_TIN] AS B_Tin1
,[QCV_BuyerSellers].[Buyer1_PhoneHome] AS B_PhoneHome
,[QCV_BuyerSellers].[Buyer1_PhoneWork] AS B_PhoneWork
,[QCV_BuyerSellers].[Buyer2_FullName] AS FULL_NAME2
,[QCV_BuyerSellers].[Buyer2_FirstName] AS BF_Name2
,[QCV_BuyerSellers].[Buyer2_MiddleName] AS BM_Name2
,[QCV_BuyerSellers].[Buyer2_LastName] AS BL_Name2
,[QCV_BuyerSellers].[Buyer2_TIN] AS B_Tin2
,[QCV_BuyerSellers].[Buyer2_PhoneHome] AS B_PhoneHome2
,[QCV_BuyerSellers].[Buyer2_PhoneWork] AS B_PhoneWork2
,[QCV_BuyerSellers].[Seller1_FirstName] AS SF_Name
,[QCV_BuyerSellers].[Seller1_MiddleName] AS SM_Name
,[QCV_BuyerSellers].[Seller1_LastName] AS SL_Name
,[QCV_BuyerSellers].[Seller1_TIN] AS S_Tin
,[QCV_BuyerSellers].[Seller1_PhoneHome] AS S_PhoneHome
,[QCV_BuyerSellers].[Seller1_PhoneWork] AS S_PhoneWork
,[QCV_BuyerSellers].[Seller2_FirstName] AS SF_Name2
,[QCV_BuyerSellers].[Seller2_MiddleName] AS SM_Name2
,[QCV_BuyerSellers].[Seller2_LastName] AS SL_Name2
,[QCV_BuyerSellers].[Seller2_TIN] AS S_Tin2
,[QCV_BuyerSellers].[Seller2_PhoneHome] AS S_PhoneHome2
,[QCV_BuyerSellers].[Seller2_PhoneWork] AS S_PhoneWork2
/*OMFILE Property table fields by order number */
,[OMFILE_PROPERTY].[PropertyAddress1] AS Prop_Adress
,[OMFILE_PROPERTY].[PropertyCity] AS Prop_City
,[OMFILE_PROPERTY].PropertyCounty AS Prop_County
,[OMFILE_PROPERTY].PropertyState AS Prop_State
,[OMFILE_PROPERTY].PropertyZip AS Prop_Zip
,[OMFILE_PROPERTY].PropertyBriefLegal1 AS Prop_Brief1
,[OMFILE_PROPERTY].PropertyBriefLegal2 AS Prop_Brief2
,[OMEXT2_SUBDIVISION].SubdPUDFlag AS SD_PUD_FLAG
,[OMEXT2_SUBDIVISION].SubdCondominiumFlag AS SD_Condo_Flag
/*OMFILE Payoff Fields for order number */
,[OMFILE_PAYOFFS].[Payoff1Name]
,[OMFILE_PAYOFFS].[Payoff1LoanNumber]
,[OMFILE_PAYOFFS].[Payoff1Phone]
,[OMFILE_PAYOFFS].[Payoff2Name]
,[OMFILE_PAYOFFS].[Payoff2LoanNumber]
,[OMFILE_PAYOFFS].[Payoff2Phone]
/*Loan Number & Amount From OMFILE_LENDERLOAN table */
,[OMFILE_LENDERLOAN].[LoanNumber]
,[OMFILE_LENDERLOAN].[LoanAmount]
FROM [REO].[dbo].[V_BuyerSellers]
INNER JOIN [REO].[dbo].[OMFILE_PROPERTY]
on V_BuyerSellers_Flat.OrderNumber = OMFILE_PROPERTY.OrderNumber
INNER JOIN
[REO].[dbo].[OMEXT2_SUBDIVISION]
on [REO].[OrderNumber] = [OMEXT2_SUBDIVISION].[OrderNumber]
INNER JOIN [REO].[dbo].[OMFILE_PAYOFFS]
on [OMFILE_PROPERTY].[OrderNumber] = [OMFILE_PAYOFFS].[OrderNumber]
INNER JOIN [REO].[dbo].[OMFILE_LENDERLOAN]
on [OMFILE_PAYOFFS].[OrderNumber] = [OMFILE_LENDERLOAN].[OrderNumber]
WHERE [QCV_BuyerSellers].[OrderNumber] = 'QCT-8735410'
我建議您先使用“包含實際執行計划”(Ctrl-M啟用/禁用此選項)運行查詢,然后尋找可以提高性能的缺失索引。 您的查詢沒有任何明顯的缺陷可以重構。 看起來您已經在使用一個視圖,可以從該查詢中創建一個新視圖並對其進行索引,但是並不能保證索引視圖的性能要優於引用索引表的視圖,通常是引用基礎視圖的索引表仍在使用。
有多種方法可以避免由於聯接多個表而導致性能下降,但是它們也有其缺點。 您可以不使用WHERE
而從該查詢創建表並為OrderNumber
字段建立索引。 如果您還沒有准備好實現適當的數據倉庫,那將是一條黑暗的道路,因為您最終可能會得到大量的一次性報告表,並且根據環境的不同,可能需要在此更新不合理的間隔。
通常,與使用舊式方法(即:在PK = FK
上使用WHERE
相比, JOINS
具有更好的性能和可讀性。
我會堅持JOINS
。
如果需要考慮性能,建議您使用SQL Profiler
進行完整的分析。
我還建議編寫一個視圖,以便在復雜查詢的SELECT
上獲得更好的性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.