对于这个神秘的标题感到抱歉,我将尝试用一个例子来解释这个问题。 我正在使用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)
答案 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