连接两个表中的行

时间:2019-09-12 07:45:01

标签: sql oracle

我有两个表Table1和Table2。我想根据TIME_STAMP数据字段将两个表数据合并在一起

我尝试了以下查询,但无法获得预期的结果

表1

CATEGORY_ID   ID   TIME_STAMP   VALUE
-------------------------------------
1            444   30-Mar-17    XXX
1            444   31-Jul-18    YYY
1            444   15-Jan-19    ZZZ

表2

CATEGORY_ID  ID    TIME_STAMP   VALUE
------------------------------------------
2           444    30-Mar-17    10/31/2017
2           444    30-May-18    10/25/2018
2           444    13-Jun-19    10/25/2018

实际结果:

TIME_STAMP    Table 1 VALUE   Table 2 value
-------------------------------------------
30-Mar-17     XXX               10/31/2017
31-Jul-18     YYY               NULL
15-Jan-19     ZZZ               NULL

查询:

SELECT
      T1.TIME_STAMP ,
      T1.X_VALUE,
      T2.X_VALUE
FROM
      TABLE1 T1
      LEFT OUTER JOIN TABLE2 T2 ON T1.ID = T2.ID
      AND 
       TO_CHAR(T1.TIME_STAMP,'MM/DD/YYYY')
      =TO_CHAR(T2.TIME_STAMP,'MM/DD/YYYY') 
      AND 
      T2.CATEGORY_ID=2

WHERE 
      T1.CATEGORY_ID =1 AND T1.ID= 444

预期结果:

TIME_STAMP   Table1 VALUE   Table2 VALUE
-----------------------------------------
30-Mar-17    XXX            10/31/2017
30-May-18    NULL           10/25/2018
31-Jul-18    YYY            NULL
15-Jan-19    ZZZ            NULL
13-Jun-19    NULL           10/25/2018

4 个答案:

答案 0 :(得分:1)

FULL OUTER JOIN进行过滤非常棘手。我建议使用子查询作为过滤条件:

select coalesce(t1.time_stamp, t2.time_stamp) as time_stamp,
       t1.x_value, t2.x_value
from (select t1.*
      from table1 t1
      where t1.CATEGORY_ID = 1 and T1.ID = 444
     ) t1 full join
     (select t2.*
      from table2 t2
      where t2.id = 444 and t2.category_id = 2
     ) t2
     on t2.id = t1.id and
        trunc(t2.time_stamp) = trunc(t1.time_stamp);

答案 1 :(得分:0)

根据您的预期结果,我认为您想在FULL OUTER JOIN列上进行一次TIME_STAMP

答案 2 :(得分:0)

您可以这样做。

SELECT COALESCE(t1.time_stamp, t2.time_stamp) AS TIME_STAMP,
       t1.value as T1_value,
       t2.value as T2_value
FROM   table01 t1
       FULL OUTER JOIN table02 t2 ON t1.time_stamp = t2.time_stamp  
+-------------+-----------+------------+
| TIME_STAMP  | T1_value  |  T2_value  |
+-------------+-----------+------------+
| 2017-03-30  | XXX       | 10/31/2017 |
| 2018-07-31  | YYY       | (null)     |
| 2019-01-15  | ZZZ       | (null)     |
| 2018-05-30  | (null)    | 10/25/2018 |
| 2019-06-13  | (null)    | 10/25/2018 |
+-------------+-----------+------------+

注意:因为您没有提到DBMS,所以我使用了SQL Server。

答案 3 :(得分:0)

在使用时间戳将两个表连接在一起之前,需要将时间戳截断为Date。 像TRUNC(“ TimeStamp”,DATE)

SELECT COALESCE(t1.time_stamp, t2.time_stamp) AS TIME_STAMP,
   t1.value as T1_value,
   t2.value as T2_value
FROM table01 t1
FULL OUTER JOIN table02 t2 
ON trunc(t1.time_stamp, 'DATE') = trunc(t2.time_stamp, 'DATE');