1

我想根据用户提供的一些约束来连接两个表。我不知道如何用语言表达,所以我将用一个例子来解释我想要做什么:

我有两张桌子:

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 * 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 回答
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 回答