2009-10-02 38 views
1

我们的第三方应用程序有以下的自定义视图:SQL - 它是什么类型的连接以及重写的最佳方式?

FROM dbo.vwPositionAssetSubWeight 
INNER JOIN dbo.vwPositionAssetSubTotal 
    ON dbo.vwPositionAssetSubWeight.AssetID = dbo.vwPositionAssetSubTotal.AssetID 
FULL OUTER JOIN dbo.vwPositionAssetPendingTrades 
    ON dbo.vwPositionAssetSubWeight.AssetID = dbo.vwPositionAssetPendingTrades.AssetID 
, dbo.vwPositionPortfoliosTotal 

注:没有where子句。

这个混乱的一些是有道理的,但我不熟悉最后一个视图如何加入或可能没有加入。 dbo.vwPositionPortfolios总是对所有内容进行交叉连接?这是我的猜测。另外,dbo.vwPositionPortfoliosTotal返回一行。

什么是重写这个的最好方法,所以对下一个开发者有意义?

哦,没有别名,111返回字段,没有文件,备注,提示,甚至面包屑的痕迹。

回答

2

这两个语句是等价的。

SELECT * 
FROM a, b 

SELECT * 
FROM a CROSS JOIN b 

检查您的where子句......可能存在加入标准,会导致您选择内部/外部连接。

+0

感谢您指出where子句问题。没有一个,但我不想在稍后添加一个时创建更多问题。 – JeffO 2009-10-02 13:54:31

0

SELECT语句的FROM子句中使用逗号与笛卡尔积(交叉连接)相同。

例如,

SELECT * 
FROM a, b 

将从a每个记录匹配与b每个记录。它相当于

SELECT * 
FROM a 
CROSS JOIN b 
2

dbo.vwPositionPortfoliosTotal的加盟标准将在WHERE子句中找到所以为了告诉它在做什么,你将不得不张贴的一部分。寻找在那里说着什么dbo.vwPositionPortfoliosTotal.[column] = dbo.[table].[column]

编辑:

作为公认的答案说,没有一个WHERE这是一个CROSS JOIN。

+0

@ongle,这对我来说是新的。您可以在同一个SQL语句中结合旧式连接语法和新式连接语法? – 2009-10-02 13:37:46

+0

是的,你可以,但我不会。 – JeffO 2009-10-02 13:55:47

+0

你可以有点,我认为* =外部连接语法有限制。但我同意@GuinnessFan,我会避免它。 – ongle 2009-10-02 15:53:47

2

这确实是一个交叉连接。如果你真的想说清楚,只需用“CROSS JOIN”替换逗号即可。

+0

dbo.vwPositionPortfoliosTotal是否参与交叉连接是不确定的。它可能只是“旧式”连接的可见部分(在提供的剪切中),其连接条件将在WHERE子句中的某处表示。 – mjv 2009-10-02 13:43:21

2

是的最后一部分', dbo.vwPositionPortfoliosTotal'是在逗号和dbo.vwPositionPortfoliosTotal之间的所有内容之间的交叉连接,但它也取决于WHERE部分。

要查看您是否可以重写此交叉连接(例如将其删除),必须显示vwPositionPortfoliosTotal中退出的字段以及使用的条件。

+0

以下是其中一个检索字段的示例:CASE WHEN dbo.vwPositionPortfoliosTotal。PositionParAmountRC = 0 THEN NULL ELSE(CAST(ISNULL(dbo.vwPositionAssetSubWeight.ParAmountRC,0)AS float)+ CAST(ISNULL(dbo.vwPositionAssetPendingTrades.ParAmountRC,0)AS float))/ CAST(dbo.vwPositionPortfoliosTotal.PositionParAmountRC AS float) END AS ParAmountRCPercentOfTotalPortfolios, – JeffO 2009-10-02 13:57:53

相关问题