1

ユーザーから提供されたいくつかの制約に基づいて、2つのテーブルを結合したいと思います。これを言葉で表現する方法がわからないので、例を使用して私がやろうとしていることを説明します。

私は2つのテーブルを持っています:

l_id    |    l_fileid                           c_id    |    c_fileid
---------------------                           ---------------------
1       |       X1                                1     |       X2
2       |       X1                                3     |       X2
3       |       X1                                2     |       Y2
4       |       X1                                
5       |       Y1                                
2       |       Y1                                

ユーザーは次のようなマッピングを提供します。X1 -> X2, Y1 -> Y2 この場合、結果は次のようになります。

l_id    |    l_fileid    |    c_fileid
-------------------------------------
1     |       X1       |       X2
2     |       X1       |       NULL
3     |       X1       |       X2
4     |       X1       |       NULL
5     |       Y1       |       NULL
2     |       Y1       |       Y2

私はこれを行うことができるクエリをなんとか書き留めましたが、これが最善の方法ではないことを望んでいます。これが私がこれまでに思いついたものです:

SELECT * FROM (
    (SELECT * FROM L WHERE l_fileid='X1')
    LEFT JOIN
    (SELECT * FROM C WHERE c_fileid='X2')
    ON l_id=c_id
)
UNION 
SELECT * FROM (
    (SELECT * FROM L WHERE l_fileid='Y1')
    LEFT JOIN
    (SELECT * FROM C WHERE c_fileid='Y2')
    ON l_id=c_id
)
4

2 に答える 2

0

編集:質問の最新の編集は良さそうです。一致するように回答を修正しました。

これを試して:

select l_id, l_fileid, c_fileid from l left outer join c on 
   l_id=c_id and 
     ((l_fileid='x1' and c_fileid='x2') or 
      (l_fileid='y1' and c_fileid='y2')) 

生成するもの:

+ --------- + ------------- + ------------- +
| l_id      | l_fileid      | c_fileid      |
+ --------- + ------------- + ------------- +
| 1         | x1            | x2            |
| 2         | x1            |               |
| 3         | x1            | x2            |
| 4         | x1            |               |
| 5         | y1            |               |
| 2         | y1            | y2            |
+ --------- + ------------- + ------------- +

私の完全なスクリプトはここにあります。それが他の誰かが答えを出すのに役立つなら:

create table l (
    l_id  int,
    l_fileid varchar(10)
);

create table c (
    c_id  int,
    c_fileid varchar(10)
);

insert into l (l_id, l_fileid) values (1, 'x1');
insert into l (l_id, l_fileid) values (2, 'x1');
insert into l (l_id, l_fileid) values (3, 'x1');
insert into l (l_id, l_fileid) values (4, 'x1');
insert into l (l_id, l_fileid) values (5, 'y1');
insert into l (l_id, l_fileid) values (2, 'y1');

insert into c (c_id, c_fileid) values (1, 'x2');
insert into c (c_id, c_fileid) values (3, 'x2');
insert into c (c_id, c_fileid) values (2, 'y2');

 select l_id, l_fileid, c_fileid from l left outer join c on 
   l_id=c_id and 
     ((l_fileid='x1' and c_fileid='x2') or 
      (l_fileid='y1' and c_fileid='y2'))
于 2013-01-23T09:22:33.730 に答える
0

私はそのようなものがうまくいくと信じています。

SELECT * FROM l
LEFT JOIN c ON l_id=c_id AND l_fileid='X1' AND c_fileid='X2'
UNION
SELECT * FROM l
LEFT JOIN c ON l_id=c_id AND l_fileid='Y1' AND c_fileid='Y2'
于 2013-01-23T09:06:34.627 に答える