我正在使用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)
不幸的是,如果特定产品有多个描述,此脚本将检索多个产品代码。
如何修改它以仅检索带描述的第一个匹配项?
答案 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);
这样可以保存重复消除步骤(或聚合),并允许更好地使用索引。