Sql Oracle连接多行

Sql Oracle连接多行,sql,oracle,sql-tuning,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列进行查询。您可以尝试以下方法: select t1.* from Table1 t1 join Table2

我有两个表,一个包含ID名称映射,另一个表包含多个ID列。为了列出第二个表的记录以及相应的ID名称,我有一个如下的查询

SELECT 
 (SELECT NAME FROM TAB2 WHERE ID = ID1 ),
 (SELECT NAME FROM TAB2 WHERE ID = ID2),
 .
 .
 .
FROM TAB1

这是唯一的办法吗?由于第二个表针对每行的每个ID列进行查询。

您可以尝试以下方法:

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

对于存在一行
Table2
Table1
的每一行,将返回与
Table1
匹配的任何ID。

作为一个选项,您可以尝试如下方式重写查询:

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
...
这在效率方面几乎不会有什么不同,但至少可以让您的查询更具可读性(当然,这是主观的)

也许还有另一个选择要考虑,但有两个大的IFS我不确定:如果它在你的情况下都适用,如果它更有效。< /P> 第一个取决于
选项卡1
中是否存在键。如果没有专用的键列,那么只要保证
(ID1、IF2、…IDN)
的所有组合都是唯一的就足够了。这种方法是否比多次查找更有效取决于
IDx
列的数量

其思想是在与中的条件类似的条件下只连接两个表一次,然后按键列分组,并使用条件聚合提取名称。我的意思是:

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, ...

显示两个表结构,并用所需的结果解释查询。看起来不错。由于ID可能不同,您需要对tab2进行多个查找,但是您需要对查询进行短语化。根据OP的查询,是
Table1
具有多个ID列,而
Table2
是查找表,尽管想法应该很清楚。遗憾的是,这个查询不会返回相同的结果。