您可以在joins on子句中使用Select语句吗?

时间:2018-10-26 15:52:34

标签: sql oracle

我正在尝试使用子查询来选择要连接的列,甚至可能: 如果说表b的值等于表a的列名? 请注意,以下示例确实指定了table_b.Column_A,但这是为了使我的问题更清楚,更混乱。 where条件将始终返回单个值/记录。

编辑:如果可以的话,我基本上试图创建一个动态的on子句。

表之间唯一的关系是Table_b包含Table_a的列作为值。

SELECT *
FROM table_a a
INNER JOIN table_b b
ON a.(select column1 FROM table_b WHERE Column1 ='Column_A') = b.Column_A

2 个答案:

答案 0 :(得分:2)

这是您想要的吗?

SELECT *
FROM table_a a INNER JOIN
     table_b b
     ON (b.Column1 = 'Column_A' AND a.column1 = b.column_A) OR
        (b.Column1 = 'Column_B' AND a.column1 = b.column_B) OR
        (b.Column1 = 'Column_C' AND a.column1 = b.column_C)

您将必须直接列出所有列。另外,JOINOR的效果通常很差。

您可以使用APPLY更简洁地表达这一点:

SELECT *
FROM table_b b CROSS APPLY
     (SELECT 'Column_A' as colname, b.Column_A as colval FROM DUAL UNION ALL
      SELECT 'Column_B', b.Column_B FROM DUAL UNION ALL
      SELECT 'Column_C', b.Column_C FROM DUAL 
     ) v JOIN
     table_a a
     ON a.column1 = v.colval
WHERE v.colname = b.Column1

请注意,此版本可在Oracle 12C +中使用。

答案 1 :(得分:1)

您不能以尝试的方式使用select语句,但是希望您使用并使用条件代码,例如:

SELECT *
FROM table_a a
INNER JOIN table_b b ON a.column1 = b.Column_A 
        and b.Column1 ='Column_A' 

否则,如果要动态构建查询代码,则应在服务器端构建一个字符串,然后将该字符串用作命令