2010-03-25 208 views
4

在SQL Server 2008:如何避免SQL中的重复子查询JOIN?

我有一个表,我想大意如下做些什么:

SELECT T1.stuff, T2.morestuff from 
(
SELECT code, date1, date2 from Table 
) as T1 
INNER JOIN 
(
SELECT code, date1, date2 from Table 
) as T2 

ON T1.code = T2.code and T1.date1 = T2.date2 

,这两个子查询完全相同。有没有什么办法可以做到这一点,而无需重复子查询脚本?

感谢

卡尔

回答

7

CTE:

;WITH YourQuery AS 
(
SELECT code, date1, date2 from Table 
) 
SELECT 
    T1.stuff, T2.morestuff 
    from YourQuery   T1 
     INNER JOIN YourQuery T2 ON T1.code = T2.code and T1.date1 = T2.date2 

FYI

在这个问题中,代码使用派生表,也称为内联视图。子查询是一个SELECT查询,它返回单个值并嵌套在SELECT,INSERT,UPDATE或DELETE语句中或另一个子查询中。子查询可以在允许表达式的任何地方使用。请参阅:http://msdn.microsoft.com/en-us/library/aa213252(SQL.80).aspx

+0

谢谢。我希望有一个性能增益 - 或者它只是清理代码? “YourQuery”仅执行一次,还是每次您从YourQuery调用SELECT ...时都会重新执行计算? – Karl 2010-03-26 13:09:50

+2

我认为它可以在每次使用时重新评估CTE,但这是确保最好的方法:在SQL Server Management Studio中,运行以下命令:SET SETPLAN_ALL ON,然后运行原始查询。您的查询将不会运行,但执行计划将显示,请查看包含“select”的第一行的'TotalSubtreeCost'列。运行查询的CTE版本,并再次查看'TotalSubtreeCost'列。有很大的区别吗?如果没有,那么它可能重新评估它。您可以查看实际的计划行,并查看SQL Server如何将您的查询分解为要处理的步骤。 – 2010-03-26 13:41:22

0

您可以使用视图。

CREATE VIEW myView AS 
SELECT code, date1, date2 
FROM Table 

然后你的查询将是这样的:

SELECT T1.stuff, T2.morestuff 
FROM myView as T1 
INNER JOIN myView as T2 ON T1.code = T2.code and T1.date1 = T2.date2 
0

为什么它们是子查询?

SELECT T1.stuff, T2.morestuff 
FROM Table T1 
INNER JOIN Table T2 
ON T1.code = T2.code and T1.date1 = T2.date2 
+1

'为什么它们是子查询?'也许OP的实际查询比问题中列出的要复杂得多。 – 2010-03-25 13:56:32

0

为什么两次锯齿表不会工作?

SELECT T1.stuff, T2.stuff FROM Table as T1 INNER JOIN Table as T2 
ON T1.code = T2.code and T1.date1 = T2.date2