多列Union Query没有重复项

时间:2012-12-18 16:21:47

标签: sql oracle union

我正在尝试用两个不同的方法(duh)编写一个包含多个列的Union Query,但由于某种原因,第二个Select语句的第二列未显示在输出中。我不知道是否正确描绘了图片,但这是我的代码:

Select empno, job
From EMP
Where job = 'MANAGER'
Union
  Select empno, empstate
  From EMPADDRESS
  Where empstate = 'NY'
  Order By empno

输出如下:

EMPNO   JOB
4600    NY
5300    MANAGER
5300    NY
7566    MANAGER
7698    MANAGER
7782    MANAGER
7782    NY
7934    NY
9873    NY

而不是5300和7782出现两次,我认为empstate会出现在输出中的job旁边。对于所有其他empno,我认为字段中的值为(null)。我不能正确理解Unions,或者这是他们应该如何工作的?

感谢您提前提供任何帮助。

5 个答案:

答案 0 :(得分:4)

如果您希望将数据放在单独的列中,则需要JOIN而不是UNION

Select e.empno, e.job, a.empstate
From EMP e
left join EMPADDRESS a
    on e.empno = a.empno
Where job = 'MANAGER'
    AND empstate = 'NY'
Order By e.empno

UNION将两个结果合并为一个集合,但数据列在同一列中。所以基本上它们是相互叠加的:

select col1, col2, 'table1' as src
from table1
union all
select col1, col2, 'table2' as src
from table2

将导致:

col1 | col2 | src
t1   | t1   | table1
t2   | t2   | table2

如果您希望将数据放在一个听起来像您单独的列中,那么您将使用表的连接。

答案 1 :(得分:1)

Bluefeet有正确的答案。

将连接视为水平组合表 - 您为每个加入的表添加了更多列到原始查询。

将联合视为垂直堆叠记录集 - 您将额外的行添加到同一列列中。

答案 2 :(得分:0)

你需要为此加入......

Select e.empno, e.job, ea.empstate
From EMP e LEFT OUTER JOIN EMPADDRESS ea ON e.empno = ea.empno
Where e.job = 'MANAGER'
And ea.empstate = 'NY'
Order By e.empno

UNION用于获取具有相同列名的2个结果集并将它们合并为一个。在您的示例中,它将集总栏2(作业和队列)放在一起,并从第一个选择中取名。

答案 3 :(得分:0)

我认为你打算写作是一个连接呢?

即如果您希望empstate为那些不在纽约的员工为空。

select empno, job, empstate
from emp e
     left outer join empaddress a
                  on a.empno = e.empno
                 and e.empstate = 'NY'
where e.job = 'MANAGER';

答案 4 :(得分:0)

这个在oracle中运行..使用union ..here内部查询将在使用empno进行分组后获取所有列,其余列是字符串连接

  select EMPNO
        ,wm_concat(job) job
        ,wm_concat(EMPSTATE) EMPSTATE 
  from 
  ( select EMPNO,job,'' as EMPSTATE  from EMP Where job ='MANAGER'
    union  select EMPNO,'' as job, EMPSTATE from EMPADDRESS Where empstate ='NY'
  )
 group by EMPNO order by 1