将伪行添加到“in子句”中不存在的行的查询结果中

时间:2017-11-21 17:35:41

标签: mysql sql select

对于这个神秘的标题感到抱歉,我将尝试用一个例子来解释这个问题。 我正在使用MySQL: 假设我有两个简单的表testA和testB定义如下:

create table testA(
pk_a int ,
des varchar(20)
);

create table testB(
pk_b int ,
des varchar(20),
fk_a int

);

使用这些值:

insert into testA values (1,'AAAA');
insert into testA values (2,'BBBB');
insert into testA values (5,'XXXX');

insert into testB values (1,'some text 1',1);
insert into testB values (2,'some text 1',2);
insert into testB values (3,'some text 1',5);

现在,如果我执行如下的简单内连接:

select * from testA a ,testB b
where a.pk_a=b.fk_a
and a.des in ('AAAA','XXXX','EEEE')

我得到2行:

pk_a | des  | pk_b | des       |    fk_a
-------------------------------------------

1     AAAA    1     some text 1      1
5     XXXX    3     some text 1      5

我想得到'EEEE'(in子句中但不存在于testA表中的值)的行,其值为null:

pk_a | des  | pk_b | des       |    fk_a
-------------------------------------------

1     AAAA    1     some text 1      1
5     XXXX    3     some text 1      5
null  EEEE    null  null             null

有没有办法实现这个目标?也许有一个工会条款? 考虑到“in子句”中的值是可变的,它们由Java应用程序传递。

任何建议都将受到赞赏。 (你可以在这里找到SQLFiddle:http://sqlfiddle.com/#!9/faae08/1

1 个答案:

答案 0 :(得分:1)

一个脏的(整洁的?)技巧是将所有这些值作为文字查询,并将结果留给现有查询:

SELECT    a.*, b.*
FROM      (SELECT 'AAAA' AS des
           UNION ALL
           SELECT 'XXXX'
           UNION ALL 
           SELECT 'EEEE') v
LEFT JOIN testA a ON v.des = a.des
LEFT JOIN testB b ON a.pk_a = b.fk_a