了解具有多个连接的复杂SQL代码

时间:2014-05-06 14:11:19

标签: sql sql-server sql-server-2008 tsql

我有一个冗长的查询,我想了解。我在这个论坛中了解到,理解复杂查询的最佳方法是拆分它们,分别检查它们的结果然后合并。我在这里粘贴了一部分代码。

  

请帮助我理解为什么它会给我一个错误:无法解析查询文本关键字“AS”附近的语法不正确。

(SELECT        AppID, AppDetailID, AppDetailSavePointID, FieldID, Value AS Acct_Renewed
 FROM          v_RptAppDetailField_v001
 WHERE         (FieldID IN (- 87, - 88, - 152, - 179, - 258, - 263)) 
               AND (AppDetailSavePointID = 0) AND (Value IS NOT NULL)) AS Acct_Renewed 
 ON 
               v_RptFlatAppDetail_v001.AppDetailID = Acct_Renewed.AppDetailID AND 
               v_RptFlatAppDetail_v001.AppID = Acct_Renewed.AppID 

当我从上面的代码中删除这部分代码时。我得到了结果。请帮我理解这里的ON条款。我很困惑,因为它没有提到任何加入。另请注意,此代码后面有一个左外连接。

AS Acct_Renewed 
 ON 
               v_RptFlatAppDetail_v001.AppDetailID = Acct_Renewed.AppDetailID AND 
               v_RptFlatAppDetail_v001.AppID = Acct_Renewed.AppID 

感谢您的帮助。提前谢谢!

3 个答案:

答案 0 :(得分:1)

您的第一个SQL块不是完整的查询。您删除的部分是较大查询的一部分。

发生的事情是这个sql ......

SELECT        AppID, AppDetailID, AppDetailSavePointID, FieldID, Value AS Acct_Renewed
 FROM          v_RptAppDetailField_v001
 WHERE         (FieldID IN (- 87, - 88, - 152, - 179, - 258, - 263)) 
               AND (AppDetailSavePointID = 0) AND (Value IS NOT NULL)

...被用作子查询。您可以在此处获取更多详细信息:http://technet.microsoft.com/en-us/library/ms189575(v=sql.105).aspx

作为子查询,它就像表一样使用。这就是为什么AS Acct_Renewed后跟ON子句的原因。此子查询将连接到您未使用该ON子句复制的上一个表。

答案 1 :(得分:1)

查询的以下部分(分别为您提供结果)称为内嵌视图。您可以为内联视图指定名称(别名)。在这里,它的名称为 Acct_Renewed

(SELECT        AppID, AppDetailID, AppDetailSavePointID, FieldID, Value AS Acct_Renewed
 FROM          v_RptAppDetailField_v001
 WHERE         (FieldID IN (- 87, - 88, - 152, - 179, - 258, - 263)) 
               AND (AppDetailSavePointID = 0) AND (Value IS NOT NULL)

以下条件表明内联视图与另一个名为 v_RptFlatAppDetail_v001 的表/视图/内联视图连接。

ON 
               v_RptFlatAppDetail_v001.AppDetailID = Acct_Renewed.AppDetailID AND 
               v_RptFlatAppDetail_v001.AppID = Acct_Renewed.AppID 

<强>参考

  1. Inline views (Oracle) on MacLochlainns Weblog
  2. A Visual Explanation of SQL Joins on Coding Horror

答案 2 :(得分:0)

Select AppID,
AppDetailID, 
AppDetailSavePointID, 
FieldID, 
Value AS Acct_Renew  
(SELECT        
AppID, 
AppDetailID, 
AppDetailSavePointID, 
FieldID, 
Value AS Acct_Renewed
 FROM          v_RptAppDetailField_v001 V
 WHERE         (V.FieldID IN (- 87, - 88, - 152, - 179, - 258, - 263)) 
               AND (VAppDetailSavePointID = 0) AND (V.Value IS NOT NULL )
               FROM v_RptAppDetailField_v001 VV 
               INNER JOIN v_RptAppDetailField_v001 V
               ON  
               v.AppDetailID = vv.AppDetailID AND 
               v.AppID = vv.AppID