0

我有 3 张桌子A,,,BC

所有 3 个表的架构如下所述:

id, time1, place, xyz, abc, pqrs  

现在两个表A都有B很多记录(大约 1000 万条)

现在A和B中的一些记录是相同的id,有些是不同的Id

现在我想将记录从A,合并B到 TableC中。合并逻辑如下

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我想通过在and之间使用外连接来使用单个 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 回答
0

结合 3 个结果集:

  1. 具有共享 ID 的记录。
  2. id 仅存在于 a 中的记录
  3. id 仅存在于 b 中的记录

1., 2. 可以组合成 1 个左连接,3. 是为唯一 id 出现而过滤的右连接。选择 a 作为 2. 的数据源,b 作为 3. 的数据源,a/b 取决于 1. 的优先级;选择逻辑可以压缩为单个条件,因为time1比较只会在没有为空的情况下产生布尔值,即。从 1 开始记录。

    insert 
      into c ( id, time1, place, xyz, abc, pqrs )
         (
            select id1
                 , time1
                 , place
                 , xyz
                 , abc
                 , pqrs
              from (
                        select a1.id    id1
                             , b1.id    id2
                             , CASE b1.time1 > a1.time1 then b1.time1   else a1.time1   end time1
                             , CASE b1.time1 > a1.time1 then b1.place   else a1.place   end place
                             , CASE b1.time1 > a1.time1 then b1.xyz     else a1.xyz     end xyz
                             , CASE b1.time1 > a1.time1 then b1.abc     else a1.abc     end abc
                             , CASE b1.time1 > a1.time1 then b1.pqrs    else a1.pqrs    end pqrs
                          from a a1
                     left join b b1 on ( b1.id = a1.id )
                         union
                        select b2.id    id1
                             , a2.id    id2
                             , b2.time1
                             , b2.xyz
                             , b2.place
                             , b2.abc  
                             , b2.pqrs                                      , 
                          from b b2
                     left join a a2 on ( a2.id = b2.id )
                         where a2.id is null
                   ) pairs
         )
         ;
于 2013-08-16T16:40:56.473 回答
0

在一个请求中:

insert into C
  -- Outer join on B: if B is null null or A has greater time take A
  select case when B.id is null or A.time1 > B.time1 then A.id else B.id end,
         case when B.id is null or A.time1 > B.time1 then A.time1 else B.time1 end,
         case when B.id is null or A.time1 > B.time1 then A.place else B.place end,
         case when B.id is null or A.time1 > B.time1 then A.xyz else B.xyz end,
         case when B.id is null or A.time1 > B.time1 then A.abc else B.abc end,
         case when B.id is null or A.time1 > B.time1 then A.pqrs else B.pqrs end
  from A, B
  where B.id (+) = A.id
union all
  -- Then get the ones in B and not in A with outer join on A
  select B.id, B.time1, B.place, B.xyz, B.abc, B.pqrs
  from B, A
  where A.id (+) = B.id
    and A.is is null
于 2013-08-16T16:42:03.440 回答