如何消除表重复

时间:2011-04-29 07:11:35

标签: oracle

我有这样的代码

select a1.col1,
       a1.col2
from a1
inner join b2 b21
on (a1.col1 = b21.col1 and b21.col5 = 'some constant')
inner join b2 b22
on (a1.col2 = b22.col2 and b22.col5 = 'some other constant')

如何重写此代码,所以我不重复表b2。 我想只使用表b2作为一个巨大的表

3 个答案:

答案 0 :(得分:2)

你能解释一下表之间的关系吗?通常,您无法重写该查询,因此它只使用B2表一次。但是,如果我们可以对数据做出一些假设,很多情况下都可以重写。

如果A1中的每一行都映射到B2中每行的一行,您可以执行类似

的操作
select a1.col1,
       a1.col2
from a1
inner join b2 b21
on (    a1.col1 = b21.col1 
    and b21.col5 IN( 'some constant', 'some other constant'))

但如果A1映射到B2中的{2}行,其中COL5为“某个常量”,而B2中有3行,COL5为'一些其他常量',原始查询将返回6个相同的行,此查询将只返回5个相同的行。

答案 1 :(得分:0)

您可以尝试在这些行上使用 WITH 某些内容(查询未测试)

WITH onetab as (SELECT col1, col2 FROM b2 WHERE col5='c1' or col5='c2') 
SELECT a1.col1, a1.col2
FROM a1
inner join onetab on a1.col1 = onetab.col1 and a1.col2 = onetab.col2

希望这能为您带来理想的结果

答案 2 :(得分:0)

另一种选择:

select a1.col1,
       a1.col2
from a1, b2
where
    a1.col1 = b2.col1 
and a1.col2 = b2.col2 
and b2.col5 in ('some constant', 'some other constant')