在一个连接中混合 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的主要内容,如果未能解决你的问题,请参考以下文章

ASPNet Entity Framework 6 - EF6,在同一个工作单元中混合异步和同步

LDAP 混合用户凭据

使用 NAudio 混合两个音频文件

如何使用 Azure WCF 中继和混合连接按钮?

为 println 连接混合类型

SAP云解决方案和企业本地部署(On-Premise)混合架构下的安全认证权限管理