我有一个父表A,它有2个外键(来自表B和C),但它一次只能有一个外键。例如:
SELECT a.evi, a.time, a.date,
a.number, a.descr, a.x,
a.y, a.z, a.FK_tableB, a.FK_tableC,
b.brand, b.type,
b.color, b.model, c.name, c.lastname,
FROM tableA a,
tableB b,
tableC c
WHERE (PK_tableA = 100 AND PK_tableB = FK_tableB)
OR (PK_tableA = 100 AND PK_tableC = FK_tableC)
(这不起作用,很明显)
当其中一个where子句为true时,如何返回数据。
答案 0 :(得分:4)
看起来你想做一个"独家OR" (XOR)您的查询。
由于SQL没有XOR,你可以尝试类似:
create table a
( a_id int, b_id int, c_id int);
create table b
( b_id int);
create table c
( c_id int);
insert into a (a_id, b_id, c_id) values (1, 1, 1);
insert into a (a_id, b_id, c_id) values (2, NULL, 2);
insert into a (a_id, b_id, c_id) values (3, 2, NULL);
insert into a (a_id, b_id, c_id) values (4, NULL, NULL);
insert into b (b_id) values (1);
insert into b (b_id) values (2);
insert into c (c_id) values (1);
insert into c (c_id) values (2);
SELECT a.a_id, a.b_id, a.c_id, b.b_id, c.c_id
FROM a
LEFT JOIN b
ON (a.b_id = b.b_id)
LEFT JOIN c
ON (a.c_id = c.c_id)
WHERE ( (b.b_id is NOT NULL AND c.c_id is NULL)
OR (c.c_id is NOT NULL AND b.b_id is NULL));
请参阅此SQLFiddle进行试用。
答案 1 :(得分:1)
使用想要使用左外连接以保持表A中的所有行,即使其他表中没有匹配的行。
SELECT a.evi, a.time, a.date, a.number, a.descr, a.x, a.y, a.z, a.FK_tableB,
a.FK_tableC, b.brand, b.type, b.color, b.model, c.name, c.lastname
FROM tableA a left outer join
tableB b
on a.FK_TableB = b.PK_tableB left outer join
tableC c
on a.FK_tableC = c.pk_TableB
where PK_tableA = 100
此外,您需要在查询中使用正确的连接语法。并且,使用别名int,SELECT子句是好的,但你也应该在ON和WHERE子句中使用它们。
答案 2 :(得分:-2)
尝试在表B和C上指定外连接 两个外连接...... 我认为它会起作用
SELECT a.evi, a.time, a.date,
a.number, a.descr, a.x,
a.y, a.z, a.FK_tableB, a.FK_tableC,
b.brand, b.type,
b.color, b.model, c.name, c.lastname,
FROM tableA a,
tableB b,
tableC c
WHERE PK_tableA = 100
AND a.PK_tableB = b.FK_tableB(+)
AND a.PK_tableB = c.FK_tableC(+)