0

私は3つのテーブルt1、t2、t3を持っています。以下はそれらのスキーマです。

私は彼らに参加する必要があり、条件があります。

In t1 table, objectName can be one of 4: 'ABC', 'DEF', 'GHI',  or 'JKL'.
If t1.objectName is 'ABC', I need to join t1.idObject with t2.id1. 
If t1.objectName is 'DEF', I need to join t1.idObject with with t2.id2. 
If t1.objectName is 'GHI', I need to join t1.idObject with t2.id3. 
If t1.objectName is 'JKL', I need to join t1.idObject with t3.id4.

I need to select t1.idObject, t1.objectName, t2.custName, t4.Message.

また、t1.objectName が 'DEF' または 'GHI' の場合、選択結果で custName が null になるようにします。

--

create table t1 (idObject int, objectName varchar(20));
create table t2 (id1 int, id2 int, id3 int, custName varchar(20));
create table t3 (id4 int, Message varchar(20));

select * from t1;
select * from t2;
select * from t3;

insert into t1 values (101, 'ABC'), (102, 'DEF'), (103, 'GHI'), (104, 'JKL'), (105, 'ABC'), (106, 'DEF'), (107, 'GHI'), (108, 'JKL');

insert into t2 values (101, 102, 103, 'Val'), (105, 106, 107, 'Mil');

insert into t3 values (104, 'Message1'), (108, 'Messgage2');

--

説明付きのクエリは高く評価されます。

どうもありがとうございました。

4

2 に答える 2

1

UNION を使用して、各クエリの結果を結合します。

SELECT t1.idObject, t1.objectName, t2.custName, NULL Message
FROM t1 JOIN t2 ON (t1.idObject = t2.id1)
WHERE t1.objectName = "ABC"
UNION ALL
SELECT t1.idObject, t1.objectName, NULL custName, NULL Message
FROM t1 JOIN t2 ON (t1.idObject = t2.id2)
WHERE t1.objectName = "DEF"
UNION ALL
SELECT t1.idObject, t1.objectName, NULL custName, NULL Message
FROM t1 JOIN t2 ON (t1.idObject = t2.id3)
WHERE t1.objectName = "GHI"
UNION ALL
SELECT t1.idObject, t1.objectName, NULL custName, Message
FROM t1 join t3 ON (t1.idObject = t3.id4)
WHERE t1.objectName = "JKL"

あなたはそれについて言及しませんでしたが、 にMessageはそのような列がないため、ABC、DEF、GHI の場合は NULL である必要があり、JKL の場合は にそのような列がないため NULL である必要t2custNameあると想定しましたt3

結果を並べ替えるには、UNION をサブクエリにする必要があります。

SELECT * FROM (
    SELECT t1.idObject, t1.objectName, t2.custName, NULL Message
    FROM t1 JOIN t2 ON (t1.idObject = t2.id1)
    WHERE t1.objectName = "ABC"
    UNION ALL
    SELECT t1.idObject, t1.objectName, t2.custName, NULL Message
    FROM t1 JOIN t2 ON (t1.idObject = t2.id2)
    WHERE t1.objectName = "DEF"
    UNION ALL
    SELECT t1.idObject, t1.objectName, t2.custName, NULL Message
    FROM t1 JOIN t2 ON (t1.idObject = t2.id3)
    WHERE t1.objectName = "GHI"
    UNION ALL
    SELECT t1.idObject, t1.objectName, NULL custName, Message
    FROM t1 join t3 ON (t1.idObject = t3.id4)
    WHERE t1.objectName = "JKL" ) x
ORDER BY idObject, custName, Message
于 2013-05-22T23:55:57.463 に答える
0

SQL の背後にある考え方は、次のように、SQL 用語で正確な要件を表現できるようにすることです。

SELECT
 whatever you need, including
 CASE WHEN t1.objectName in ( 'DEF' , 'GHI') 
  THEN NULL
  ELSE t2.custName
 END AS custName
FROM
 t1, t2, t3
WHERE
 (t1.objectName = 'ABC' AND t1.idObject = t2.id1) 
 OR
 (t1.objectName = 'DEF' AND t1.idObject = t2.id2)
 OR
 ...

これをすべての要件に拡張できることを願っています。

于 2013-05-22T23:37:45.310 に答える