【发布时间】:2015-12-25 21:12:06
【问题描述】:
我正在编写一个查询以从八个表中获取 50 列。只是出于好奇,有没有更好的方法来获取数据而不是使用一系列inner join Table A on Table B.orderNumber = Table A.OrderNumber 来获取表 A-H?
运行的数据库是 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'
【问题讨论】:
-
可能不会,但您应该发布有关您的表结构和用于加入的查询的信息以获得更好的反馈
-
同意@Samcd。在某些情况下,如果其中一些表足够小且足够稳定,并且您经常查询它们,那么将整个表加载到您的程序中并将它们保留在那里以供多个数据库查询可能是有利可图的。但是很可能数据库服务器在缓存和优化方面会比你做得更好 - 假设你已经创建了使这些连接有效的索引。最后一点非常重要。你有那些索引吗?
-
据我所知没有,但是连接顺序取决于各个表中的数据可以帮助您在某些情况下获得更好的性能,请查看sql-server-performance.com/2006/tuning-joins
-
在这种情况下,创建查询结果的索引视图可以提高性能。此 Stack Overflow 答案包含有关 SQL Server 中的索引视图的更多信息 - stackoverflow.com/questions/3986366/…
-
如果您处理非常大的表并且您知道,您只需要几行(预选),CTE 可能是一个好主意。如果您仅在特殊条件下需要子数据,则 APPLY 可以提供更好的计划。但是 - 在大多数情况下! - 不应该试图巧妙地优化优化器;-) 在大多数情况下,索引和统计数据、缓存和重构的隐式使用将接近最佳...
标签: sql sql-server-2008 join inner-join