Oracle连接多行

时间:2012-07-03 09:20:31

标签: sql oracle sql-tuning

我有两个表,一个包含ID< - >名称映射,另一个表包含多个ID列。要列出第二个表的记录以及相应的ID名称,我有一个像

这样的查询
SELECT 
 (SELECT NAME FROM TAB2 WHERE ID = ID1 ),
 (SELECT NAME FROM TAB2 WHERE ID = ID2),
 .
 .
 .
FROM TAB1

这是唯一的方法吗?因为每行的每个ID列都会查询第二个表。

2 个答案:

答案 0 :(得分:2)

您可以尝试这种方法:

select t1.*
from Table1 t1
join Table2 t2 on t1.id=t2.id1 OR t1.id=t2.id2 OR t1.id=t2.id3

Table1的每一行都有一行Table2,以便其任何ID与Table1匹配。

答案 1 :(得分:0)

作为一种选择,您可以尝试重写您的查询:

SELECT 
 b1.NAME,
 b2.NAME,
 .
 .
 .
FROM TAB1 a
INNER JOIN TAB2 b1 ON a.ID1 = b1.ID
INNER JOIN TAB2 b2 ON a.ID1 = b1.ID
...

这在效率方面几乎没有任何区别,但它至少可能使你的查询更具可读性(当然这是主观的)。

可能还有另一种选择需要考虑,但有两个大的IF我不确定:它是否适用于您的情况以及是否会更有效。

第一个取决于TAB1中是否存在密钥。如果没有专用键列,那么(ID1, IF2, ... IDN)的所有组合都保证是唯一的就足够了。此方法是否比多次查找更有效取决于IDx列的数量。

我们的想法是在类似于@dasblinkenlight's answer的条件下加入两个表一次,然后按键列分组,并使用条件聚合拉出名称。这就是我的意思:

SELECT
  MAX(CASE TAB2.ID WHEN TAB1.ID1 THEN TAB2.NAME END) AS NAME1,
  MAX(CASE TAB2.ID WHEN TAB1.ID2 THEN TAB2.NAME END) AS NAME2,
  .
  .
  .
FROM TAB1
INNER JOIN TAB2 ON TAB2.ID IN (TAB1.ID1, TAB1.ID2, ...)
GROUP BY TAB1.ID1, TAB1.ID2, ...