3

我正在尝试Union Query使用来自两个不同 talbes 的多个列(duh)编写一个,但由于某种原因,第二个语句的第二列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正确,还是他们应该这样工作?

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

4

5 回答 5

4

如果您希望将数据放在单独的列中,您将需要 a JOINnot a 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

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

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

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

于 2012-12-18T16:24:54.197 回答
1

蓝脚有正确的答案。

将连接视为水平组合表 - 您正在使用您连接的每个表向原始查询添加更多列。

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

于 2012-12-18T17:10:16.950 回答
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 列(作业和 empstate)集中在一起,并从第一个选择中获取名称。

于 2012-12-18T16:25:34.880 回答
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';
于 2012-12-18T16:28:38.507 回答
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
于 2012-12-18T17:02:22.280 回答