-1

私はSQLが初めてです。少し問題があります-これが私が得ているものです:

PROJECT_NO       EMPLOYEE_NO      HARDWARE       SOFTWARE  
------------------------------------------------------------
01                   1            MOUSE          SQL
01                   2            MOUSE          SQL
01                   3            MOUSE          SQL
01                   4            MOUSE          SQL
01                   1            KEYBOARD
01                   2            KEYBOARD
01                   3            KEYBOARD
01                   4            KEYBOARD

このプロジェクトには 2 種類のハードウェアが必要なため、従業員は同じことを繰り返しています。

テーブルの内容は次のとおりです。

Requirements(
  project_no, 
  hardware, 
  software
 )

Assignment(
  project_no, 
  employee_no
)

ここに私が欲しいものがあります:

PROJECT_NO       EMPLOYEE_NO      HARDWARE       SOFTWARE  
---------------------------------------------------------------------
01                   1            MOUSE          SQL
01                   2            KEYBOARD          
01                   3                      
01                   4                      

どうすればこれを行うことができますか?

4

2 に答える 2

2

テーブルにデータを含めていないため、または不要な結果を取得するために使用しているクエリが含まれていないため、要件は質問から非常に不明確です。

しかし、私はこれがあなたが望むことをすることを推測しています:

Select
  x.Project_No,
  x.Employee_No,
  y.Hardware,
  y.Software
From (
  Select
    a.*,
    RowNum As rn
  From
    Assignment a
  ) x Full Outer Join (
    Select
      r.*,
      RowNum As rn
    From
      Requirements r
  ) y on x.rn = y.rn

http://sqlfiddle.com/#!4/88178/6

3列目と4列目の値は、1列目と2列目の値とは関係がないため、これは非常に愚かなクエリであることを指摘しておく必要があります。

于 2012-11-18T18:46:37.890 に答える
1

Oracle を使用した例:

create table Requirements
(
  project_no integer not null
  ,hardware varchar2(64)
  ,software varchar2(64)
);

create table Assignment
(
  project_no integer not null
  ,employee_no integer not null
);

insert into Requirements (project_no, hardware, software)
values (1, 'Mouse', 'SQL'); 
insert into Requirements (project_no, hardware, software)
values ( 1, 'Keyboard', '');

insert into Assignment (project_no, employee_no)
values (1, 1);
insert into Assignment (project_no, employee_no)
values (1, 2);
insert into Assignment (project_no, employee_no)
values (1, 3);
insert into Assignment (project_no, employee_no)
values (1, 4);

select r.project_no, a.employee_no, r.hardware, r.software
from Assignment a
inner join Requirements r
on r.project_no = a.project_no;

select nvl(r.project_no, a.project_no) as project_no
, a.employee_no
, r.hardware
, r.software
from 
(
  select row_number() over (partition by project_no order by employee_no) r 
  , project_no
  , employee_no
  from Assignment
) a
full outer join 
(
  select row_number() over (partition by project_no order by hardware desc, software desc) r 
  , project_no
  , hardware
  , software
  from Requirements
) r
on r.project_no = a.project_no
and r.r = a.r;

drop table Assignment;
drop table Requirements;

SQL Server を使用した例 (Oracle では若干の編集が必要になる場合があります):

create table #Requirements
(
  project_no bigint not null
  ,hardware nvarchar(64)
  ,software nvarchar(64)
)

create table #Assignment
(
  project_no bigint not null
  ,employee_no bigint not null
)

insert #Requirements 
      select 1, 'Mouse', 'SQL'
union select 1, 'Keyboard', ''

insert #Assignment
      select 1, 1
union select 1, 2
union select 1, 3
union select 1, 4

--your original query
select r.project_no, a.employee_no, r.hardware, r.software
from #Assignment a
inner join #Requirements r
on r.project_no = a.project_no

--query which gives you the result you're after (though not recommended, since this isn't really how you should use SQL)
select isnull(r.project_no, a.project_no) project_no
, a.employee_no
, r.hardware
, r.software
from (select row_number() over (partition by project_no order by employee_no) r , * from #Assignment) a
full outer join (select row_number() over (partition by project_no order by hardware desc, software desc) r , * from #Requirements) r
on r.project_no = a.project_no
and r.r = a.r 

drop table #Assignment
drop table #Requirements
于 2012-11-18T19:07:29.073 に答える