2

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

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

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

4

2 回答 2

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行将被返回。

于 2012-07-03T09:27:39.210 回答
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 的答案中的条件下仅加入两个表一次,然后按键列分组并使用条件聚合提取名称。这就是我的意思:

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, ...
于 2012-07-03T19:29:56.767 回答