仅当Oracle中的表格中的最大值为

时间:2016-10-30 04:46:52

标签: sql oracle max

我有2张桌子。如果表1的日期大于表2,则只应在输出中填充那些记录。

表1:

ID Category Date
1  A        3/2/1990
1  A        3/5/2013
1  C        4/3/1979
2  D        4/3/1970
2  D        5/6/2016
3  E        8/8/2016

表2:

ID Category Date
1   A       3/2/1990
1   C       4/3/1979
1   C       4/3/1982
1   D       4/3/1982
2   D       5/6/2016

预期的输出

ID  Category Date
1   A        3/5/2013
3   E        8/8/2016

我尝试了以下查询,但它给我的结果不正确。

select a.id,a.category,a,Date from table1 a where
a.Date > (select Max(b.Date) from table2 b where a.id=b.id and a.category =b.catgory group by b.id,b.category)

4 个答案:

答案 0 :(得分:1)

<强> SQL Fiddle Demo

WITH cte AS ( 
    SELECT ID, Category, MAX(Date) as mdate
    FROM Table2
    GROUP BY ID, Category    
)    
SELECT T1.*  --, T2.*
FROM Table1 as T1
LEFT JOIN cte as T2
  ON T1.ID = T2.ID
 AND T1.Category = T2.Category
WHERE T1.Date > T2.mdate
   OR T2.mdate is NULL

<强>输出

enter image description here

答案 1 :(得分:0)

SELECT T1.*
FROM Table1 AS T1 INNER JOIN Table2 AS T2
     ON T1.ID = T2.ID
WHERE T1.Date > T2.mdate;

答案 2 :(得分:0)

根据所需的输出,您需要使用left outer join

SELECT T1.*
FROM table1 T1
LEFT OUTER JOIN (
    SELECT ID
        ,category
        ,MAX(Date) mdate
    FROM Table2
    GROUP BY ID
        ,category
    ) T2 ON (
        T1.ID = T2.ID
        AND T1.category = T2.category
        )
WHERE T1.date > nvl(T2.mdate, '01/01/1900');

答案 3 :(得分:0)

过滤表2

SELECT ID, Category,MAX(Date) as Date
 FROM Table2
 GROUP BY ID,Category;

| ID | Category |                    Date |
|----|----------|-------------------------|
|  1 |        A | March, 02 1990 00:00:00 |
|  1 |        C | April, 03 1982 00:00:00 |
|  1 |        D | April, 03 1982 00:00:00 |
|  2 |        D |   May, 06 2016 00:00:00 |

现在使用它来创建一个左连接与Table1:

    SELECT t1.* 
FROM Table1 t1 LEFT JOIN 
  (SELECT ID, Category,MAX(Date) as Date
     FROM Table2
     GROUP BY ID,Category) AS t2part
   ON t1.ID = t2part.ID
   AND t1.Category = t2part.Category
WHERE t1.Date > t2part.Date;

| ID | Category |                    Date |
|----|----------|-------------------------|
|  1 |        A | March, 05 2013 00:00:00 |

请注意,由于在JOIN中既没有匹配ID也没有匹配,因此找不到ID = 3,category = E的行。 作为实体应该进行交互的良好实践,必须应用某种规范化,以便我们可以通过索引充分利用连接。

fiddle包含您提供的数据和查询。