Sql 从多个列中选择

Sql 从多个列中选择,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,所以我有一个表,我们称之为主表,它有以下示例列 Name, Code_1, Code_2, Code_3, Code_4, Code_5 在我的真实示例中,有25个代码列 我在临时表中插入了一组300个代码,从主表中获取与临时表中的代码匹配的行的最佳方法是什么 到目前为止,我的方法是有效的,但似乎效率极低 SELECT * FROM MAIN WHERE (CODE_1 IN (SELECT CODE FROM TMP_TABLE) OR CODE_2 IN(SELECT CODE FROM

所以我有一个表,我们称之为主表,它有以下示例列

Name,
Code_1,
Code_2,
Code_3,
Code_4,
Code_5
在我的真实示例中,有25个代码列

我在临时表中插入了一组300个代码,从主表中获取与临时表中的代码匹配的行的最佳方法是什么

到目前为止,我的方法是有效的,但似乎效率极低

SELECT * FROM MAIN WHERE (CODE_1 IN (SELECT CODE FROM TMP_TABLE) 
OR CODE_2 IN(SELECT CODE FROM TMP_TABLE) 
OR CODE_3 IN (SELECT CODE FROM TMP_TABLE)
OR CODE_4 IN (SELECT CODE FROM TMP_TABLE)
OR CODE_5 IN (SELECT CODE FROM TMP_TABLE)) 

一种方法是使用相关子查询:

SELECT *
FROM MAIN m
WHERE EXISTS (
    SELECT *
    FROM TMP_TABLE t
    WHERE t.CODE = m.CODE_1 OR t.CODE = m.CODE_2 OR ...
)

一种方法是使用相关子查询:

SELECT *
FROM MAIN m
WHERE EXISTS (
    SELECT *
    FROM TMP_TABLE t
    WHERE t.CODE = m.CODE_1 OR t.CODE = m.CODE_2 OR ...
)
加入会更快

SELECT * FROM MAIN 
inner join TMP_TABLE
on main.code_1 = tmp_table.code 
    or main.code_2 = tmp_table.code 
    or main.code_3 = tmp_table.code
    or main.code_4 = tmp_table.code
    or main.code_5 = tmp_table.code
但是正如注释中提到的,如果主表中的多个代码与tmp_表中的连接条件匹配,那么连接可能会增加行数

SELECT * FROM MAIN 
inner join TMP_TABLE
on main.code_1 = tmp_table.code 
    or main.code_2 = tmp_table.code 
    or main.code_3 = tmp_table.code
    or main.code_4 = tmp_table.code
    or main.code_5 = tmp_table.code

但是正如注释中提到的,如果主表中有多个代码与tmp_表中的连接条件匹配,那么连接可能会增加行数

25个代码列听起来像是一个糟糕的数据模型。不一定如此,但似乎如此。通常,您希望有一个带有名称和一些ID的主表,再加上一个子表,每个主ID和代码有一条记录。有了这样一个数据模型,查询将非常容易编写。@ThorstenKettner我同意,这很糟糕。至少它不是一个包含逗号分隔代码的文本列,所以我认为这是一个改进。不幸的是,我无法控制数据模型,长话短说,由于数据在我们的系统中流动的方式,它在某种程度上是有意义的,因为我们不试图在系统中的那个点分解数据。似乎是最好的方法。25代码列听起来像一个糟糕的数据模型。不一定如此,但似乎如此。通常,您希望有一个带有名称和一些ID的主表,再加上一个子表,每个主ID和代码有一条记录。有了这样一个数据模型,查询将非常容易编写。@ThorstenKettner我同意,这很糟糕。至少它不是一个包含逗号分隔代码的文本列,所以我认为这是一个改进。不幸的是,我无法控制数据模型,长话短说,由于数据在我们的系统中流动的方式,它在某种程度上是有意义的,因为我们不试图在系统中的那个点分解数据。似乎是最好的方法。为什么加入会更快?我看不出这一点。我一直对哪一个更快感到困惑,从我所读到的来看,这取决于执行计划。但一般来说,联接比子查询快。这个答案是误导性的,因为相关子查询仍然是最快的查询,而Oracle的优化器比MySQL聪明得多。为什么连接会更快?我看不出这一点。我一直对哪一个更快感到困惑,从我所读到的来看,这取决于执行计划。但一般来说,联接比子查询快。这个答案是误导性的,因为相关子查询仍然是最快的查询,而且Oracle的优化器比MySQL聪明得多。如果这比OP的版本性能更好,我也不会感到惊讶。你误解了。我认为这会有更好的性能,因为Oracle实现了跳过扫描索引搜索。如果这比OP的版本有更好的性能,我不会感到惊讶。你误解了。我认为这会有更好的性能,因为Oracle实现了跳过扫描索引搜索。