3

2 つの異なる talbes から複数の列を記述しようとしてUnion Queryいますが (duh)、何らかの理由で 2 番目のSelectステートメントの 2 番目の列が出力に表示されません。それが絵を正しく描いたかどうかはわかりませんが、ここに私のコードがあります:

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 が 2 回表示される代わりに、出力のempstate横に表示されると思いました。jobempnoのすべてのフィールドの値は(null). 私はUnions正しく理解していませんか、それともこれがどのように機能するはずですか?

事前に助けてくれてありがとう。

4

5 に答える 5

4

別の列にデータが必要な場合は、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は 2 つの結果を 1 つのセットに結合しますが、データは同じ列にリストされます。したがって、基本的にそれらは互いに重ねて配置されます。

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

私はあなたが書くつもりだったのは代わりに結合としてだと思いますか?

つまり、ニューヨークにいない従業員のempstateをnullにしたい場合です。

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

これにはJOINが必要です。

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つの結果セットを取得し、それらを1つにマージするためのものです。あなたの例では、列2(jobとempstate)をまとめて、最初の選択から名前を取得しています。

于 2012-12-18T16:25:34.880 に答える
0

これはOracleで機能します。ユニオンを使用して..ここで内部クエリは、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 に答える