0

3 つのテーブルがありますA, B,C

3 つのテーブルすべてのスキーマは、以下で説明するものと同じです。

id, time1, place, xyz, abc, pqrs  

現在、両方のテーブルAB多くのレコードがあります (約 1,000 万)

現在、A と B のレコードの一部は同じidで、一部は異なっていますId

Aここで、からのレコードBを Tableにマージしたいと考えていCます。マージロジックは次のとおりです

1)If records with id = someId is present only in A or B ( only in one table)
    then insert record from that table (A/B depending of where its present) in table C
2)If records with id =someId is present in both A and B {

           if(A.time1 > B.time2){
             insert record from A into C
          }else{
             insert record from B into C
          }
    }

Aとの間の外部結合を使用して、単一の SQL クエリを使用して実行したいと考えていますB。しかし、私はそれについてどうすればよいのかはっきりしていません。

4

5 に答える 5

2

テーブルが空であると仮定するとC、このようなものがうまくいきます

INSERT INTO C           
SELECT A.* 
  FROM A LEFT OUTER JOIN B
  ON A.ID = B.ID
 WHERE (A.TIME1 > B.TIME1 OR B.TIME1 IS NULL)
UNION 
SELECT B.*
  FROM B LEFT OUTER JOIN A
  ON B.ID = A.ID
 WHERE (A.TIME1 <= B.TIME1 OR A.ID IS NULL)
于 2013-08-16T16:34:45.510 に答える
1

を使用UNIONすると、次のようなことを試すことができます。

INSERT INTO C
SELECT A.* 
FROM A 
LEFT OUTER JOIN B ON A.ID = B.ID 
WHERE A.TIME1 > B.TIME1 OR B.ID IS NULL
UNION 
SELECT B.*
FROM B 
LEFT OUTER JOIN A ON B.ID = A.ID 
WHERE B.TIME1 > A.TIME1 OR A.ID IS NULL

SQLFIDDLE : http://www.sqlfiddle.com/#!4/5019b/2/0

于 2013-08-16T16:53:07.597 に答える
0
CREATE TABLE t_c
(
    id_c   NUMBER
,   time_c DATE
);

INSERT
WHEN    id_a IS NULL THEN INTO t_c(id_c, time_c) VALUES (id_b, time_b)
WHEN    id_b IS NULL THEN INTO t_c(id_c, time_c) VALUES (id_a, time_a)
WHEN    id_a = id_b AND time_a >  time_b THEN INTO t_c(id_c, time_c) VALUES (id_a, time_a)
WHEN    id_a = id_b AND time_a <= time_b THEN INTO t_c(id_c, time_c) VALUES (id_b, time_b)
SELECT  *
FROM
(
        SELECT  1 id_a, DATE'2013-01-01' time_a FROM dual UNION ALL
        SELECT  2 id_a, DATE'2013-01-02' time_a FROM dual UNION ALL
        SELECT  3 id_a, DATE'2013-01-03' time_a FROM dual UNION ALL
        SELECT  4 id_a, DATE'2013-01-04' time_a FROM dual UNION ALL
        SELECT  7 id_a, DATE'2013-01-07' time_a FROM dual UNION ALL
        SELECT  8 id_a, DATE'2013-01-08' time_a FROM dual
) t_a
FULL    JOIN
(
        SELECT  1 id_b, DATE'2013-01-01' time_b FROM dual UNION ALL
        SELECT  2 id_b, DATE'2013-01-02' time_b FROM dual UNION ALL
        SELECT  5 id_b, DATE'2013-01-05' time_b FROM dual UNION ALL
        SELECT  6 id_b, DATE'2013-01-06' time_b FROM dual UNION ALL
        SELECT  7 id_a, DATE'2013-01-09' time_a FROM dual UNION ALL
        SELECT  8 id_a, DATE'2013-01-01' time_a FROM dual
) t_b
ON      t_a.id_a = t_b.id_b
;
/*
1   2013-01-01 00:00:00     1   2013-01-01 00:00:00
2   2013-01-02 00:00:00     2   2013-01-02 00:00:00
                            5   2013-01-05 00:00:00
                            6   2013-01-06 00:00:00
7   2013-01-07 00:00:00     7   2013-01-09 00:00:00
8   2013-01-08 00:00:00     8   2013-01-01 00:00:00
4   2013-01-04 00:00:00     
3   2013-01-03 00:00:00     
*/

SELECT  *
FROM    t_c;
/*
5   2013-01-05 00:00:00
6   2013-01-06 00:00:00
4   2013-01-04 00:00:00
3   2013-01-03 00:00:00
8   2013-01-08 00:00:00
1   2013-01-01 00:00:00
2   2013-01-02 00:00:00
7   2013-01-09 00:00:00
*/
于 2013-08-16T16:52:26.247 に答える