Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅第一列不带重复项的并集_Sql_Oracle_Union - Fatal编程技术网

Sql 仅第一列不带重复项的并集

Sql 仅第一列不带重复项的并集,sql,oracle,union,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) 不幸的是,如果特定产品

我使用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)
不幸的是,如果特定产品有多个描述,此脚本将检索多个产品代码


如何对其进行修改以仅检索第一次出现的描述?

如果您想要任何一个描述,可以使用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

如果您想要任何一种描述,可以选择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

我认为这个解决方案是可行的,但可能并不完美

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)
)

我认为这个解决方案是可行的,但可能并不完美

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)
)

如果表中没有重复项且
description
不采用
NULL
值,则使用
完全外部联接可以提高查询效率:

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);

这将节省重复消除步骤(或聚合),并允许更好地使用索引。

如果表中没有重复项且
说明
不采用
空值,则使用
完全外部联接可以更有效地查询:

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);

这节省了重复消除步骤(或聚合),并允许更好地使用索引。

+1:不过,为了挑剔起见,列表中的第一个相当于
MIN()
,而不是
MAX()
;)[由于默认顺序为升序。]@MatBailie:我猜你错了-在这种情况下,MIN和MAX都不会选择第一个元素(假设描述是字符串)。+1:不过,为了挑剔起见,列表中的第一个元素相当于
MIN()
,而不是
MAX()
;)[由于默认顺序为升序。]@MatBailie:我猜你错了-在这种情况下,MIN和MAX都不会选择第一个元素(假设描述是字符串)。当你说
first
时,你是指
first字母顺序
,还是可能是
写入数据库的第一个描述
?如果是后者,我们是否可以使用另一个字段来标识哪个记录是
第一个
?当您说
第一个
时,是指
第一个字母顺序
,还是可能是
写入数据库的第一个描述
?如果是后者,我们是否可以使用另一个字段来标识哪个记录是
第一个
?如果一个代码在同一个表中有多个描述该怎么办?@MatBailie:那么我们不知道如何选择第一个。@David IT:喜欢。最好用工会代替工会ALL@vav-除了你的答案确实有一个机制来选择每一行中按字母顺序排列的第一行。@MatBailie:我仍然认为这个解决方案对于处理乘法行大致相同。如果您不需要分析功能(例如,计划使用mysql),则更好;如果您将使用tab3、tab4、…,则不好,。。。我相信“不优雅”David正是这个意思。如果一个代码在同一个表中有多个描述呢?@MatBailie:那么我们不知道如何选择第一个。@David IT:喜欢。最好用工会代替工会ALL@vav-除了你的答案确实有一个机制来选择每一行中按字母顺序排列的第一行。@MatBailie:我仍然认为这个解决方案对于处理乘法行大致相同。如果您不需要分析功能(例如,计划使用mysql),则更好;如果您将使用tab3、tab4、…,则不好,。。。我相信“不优雅”大卫的意思就是这样。