联盟只有第一列没有重复

时间:2014-05-19 12:57:48

标签: sql oracle union

我正在使用UNION语法从多个数据库中检索产品代码和描述。

我想只检索唯一的产品代码,即使此产品代码有多个描述。我想只撤回第一个结果。

要做到这一点,我正在使用这个脚本:

SELECT * FROM (SELECT tab1.code, tab1.description FROM tab1
UNION
SELECT tab2.code, tab2.description FROM tab2
UNION
SELECT tab3.code, tab3.description FROM tab3)

不幸的是,如果特定产品有多个描述,此脚本将检索多个产品代码。

如何修改它以仅检索带描述的第一个匹配项?

3 个答案:

答案 0 :(得分:4)

如果你想要任何一个描述,你可以像这样使用max或min:

select code, max(description) from (your set of unions)
group by code

在这种情况下,您可以将UNION更改为UNION ALL以跳过排序。

如果你真的想要第一个,你需要指出它:

select code, description from (
select code, description, ord, min(ord) over (partition by code) min_ord from ( 
select code, description, 1 as ord from table1
union all
select code, description, 2 as ord from table2
union all
select code, description, 3 as ord from table3
)
) where ord = min_ord

答案 1 :(得分:1)

我认为这个解决方案有效,但可能并不优雅。

SELECT * FROM 
(
SELECT tab1.code, tab1.description FROM tab1
UNION
SELECT tab2.code, tab2.description FROM tab2 WHERE tab2.code not in 
(SELECT tab1.code FROM tab1)
UNION
SELECT tab3.code, tab3.description FROM tab3 WHERE tab3.code not in 
(SELECT tab1.code FROM tab1 
UNION
SELECT tab2.code FROM tab2)
)

答案 2 :(得分:0)

如果表格中有没有重复项且full outer join未接受description值,则NULL的查询可能会更有效率:< / p>

SELECT coalesce(tab1.code, tab2.code, tab3.code) as code,
       coalesce(tab1.description, tab2.description, tab3.description) as description
FROM tab1 full outer join
     tab2
     on tab2.code = tab1.code full outer join
     tab3
     on tab3.code = coalesce(tab1.code, tab2.code);

这样可以保存重复消除步骤(或聚合),并允许更好地使用索引。