SQL - 它是什么类型的连接和重写的最佳方式?

时间:2009-10-02 13:23:09

标签: sql sql-server sql-server-2005 tsql

我们的第三方应用程序具有以下自定义视图:

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.vwPositionPortfoliosTotal是否对所有内容都是交叉连接?这是我的猜测。此外,dbo.vwPositionPortfoliosTotal返回一行。

重写此内容的最佳方法是什么,这对下一位开发人员有意义吗?

哦,没有别名,111个返回的字段,没有文档,备注,提示甚至是一堆面包屑。

5 个答案:

答案 0 :(得分:2)

dbo.vwPositionPortfoliosTotal的连接标准将在WHERE子句中找到,因此为了说明它的作用,您必须发布该部分。寻找它所说的dbo.vwPositionPortfoliosTotal.[column] = dbo.[table].[column]

之类的内容

编辑:

正如接受的答案所说,没有WHERE这是一个交叉加入。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

要查看您是否可以重写此交叉联接(例如删除它),您必须显示从vwPositionPortfoliosTotal中删除了哪些字段以及使用了哪些条件。

答案 3 :(得分:2)

这两个陈述是等价的。

SELECT *
FROM a, b

SELECT *
FROM a CROSS JOIN b

检查你的where子句......可能会有隐藏在其中的加入条件,这会导致你选择内部/外部联接。

答案 4 :(得分:0)

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

例如,

SELECT *
FROM a, b

会将a中的每条记录与b的每条记录相匹配。它相当于

SELECT *
FROM a
CROSS JOIN b