2

(テーブルBとCからの)2つの外部キーを持つ親テーブルAがありますが、一度に1つの外部キーしか持つことができません。例:

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句の1つだけが真の場合にデータを返すにはどうすればよいですか。

4

3 に答える 3

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を参照して試してみてください。

于 2012-07-16T14:19:16.710 に答える
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

また、クエリで適切な結合構文を使用する必要があります。また、SELECT 句でエイリアスを使用することは良いことですが、ON 句と WHERE 句でも使用する必要があります。

于 2012-07-16T14:17:58.150 に答える
-2

テーブル B と C で外部結合を指定してみてください 2 つの外部結合....うまく いくと思います

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(+)
于 2012-07-16T14:17:18.573 に答える