在一个连接中混合 ON 和 USING
Posted
技术标签:
【中文标题】在一个连接中混合 ON 和 USING【英文标题】:Mixing ON and USING within one join 【发布时间】:2009-03-13 16:21:16 【问题描述】:有没有办法在 Oracle 中执行以下操作:
SELECT *
FROM Tbl1
JOIN Tbl2
USING (col1)
AND ON Tbl1.col2 = Tbl2.col3
【问题讨论】:
【参考方案1】:在标准 SQL 中,您可以使用 USING 或 ON,但不能同时使用。如果您可以同时使用这两种方法,则可以在示例中省略 AND。
PMV 评论(更准确地说,问 - 另见发帖人的回答):
我的问题是我有一堆表,都使用 USING 连接。如果我尝试添加具有不同键名的表,则会出现模棱两可的列错误。有没有一种优雅的方法可以在不将我的所有联接转换为 ON 联接的情况下做到这一点?
好吧,限制由可悲的错误命名的列造成的损害的最佳方法可能是(并且大致 - 我没有调试下面的 SQL):
SELECT *
FROM (SELECT *
FROM Tbl1
JOIN Tbl2 USING (col1, col2, col3, col4)
JOIN Tbl3 USING (col2, col4, col6, col23)
JOIN Tbl4 USING (col2, col8, col3, col23)
) AS SystematicNaming
JOIN Tbl5
ON SystematicNaming.Col1 = Tbl5.Col1
AND SystematicNaming.ColA = Tbl5.PoorlyNamedColA
AND SystematicNaming.ColB = Tbl5.PoorlyNamedColB
这会尽可能长时间地保留方便和系统的 USING 表示法,同时管理与 Tbl5 的连接,因为它必须在与 Tbl5 连接所需的非统一列名的情况下进行管理。
我不确定这是最好的查询布局,但我认为它是合理的。
【讨论】:
我的问题是我有一堆表,都使用 USING 连接。如果我尝试添加具有不同键名的表,则会出现模棱两可的列错误。有没有一种优雅的方法可以做到这一点,而无需将我的所有联接都转换为 ON 联接?【参考方案2】:SELECT * FROM TBL1 JOIN TBL2 ON TBL1.COL1 = TBL2.COL1 AND TBL1.COL2 = TBL2.COL3
问候 克
【讨论】:
【参考方案3】:SELECT *
FROM Tbl1
INNER JOIN Tbl2
ON Tbl1.col1 = Tbl2.col1
AND Tbl1.col2 = Tbl2.col3
【讨论】:
以上是关于在一个连接中混合 ON 和 USING的主要内容,如果未能解决你的问题,请参考以下文章