我正在尝试用两个不同的方法(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
,或者这是他们应该如何工作的?
感谢您提前提供任何帮助。
答案 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