Oracle 子查询案例

Oracle subselect case

所以,有 2 个表

  1. 表 1(包含所有文章,居中,日期 00000)
  2. Tabla2(包含手写的文章(也在表 1 中),居中,日期)

我们有一个程序,每天比较 Table1 和 Table2 文章和中心,如果它们匹配,更新会更改该文章和中心的 Table1 日期。

现在,我们还想添加一些内容,如果 Tabla2 上的中心为“ ”(空),它会更新表 1 中包含该文章的每个中心。 这是 OracleSQL:

               update Table1 r
               set date1= (SELECT max(date2) FROM Tabla2 t 
               where t.articulo = r.articulo
               and t.center = to_char(center) //It gets the center from a select behind
               and t.date2 >= to_char(sysdate,'yyyymmdd')
               group by t.center);

我们希望这两种情况都有效

  1. 如果中心有像20这样的真实中心,它只会更新中心20。
  2. 如果中心有一个空的 '' 则它会用该文章更新每个中心。

我会用这样的东西:

and t.center = nvl(to_char(center),t.center)

如果中心有人居住,它将使用该值。如果 center 为 null,则 nvl 将导致 t.center 的值。基本上导致 t.center=t.center (这再次意味着总是正确的)。

您可以使用:

UPDATE Table1 r
SET date1 = ( SELECT MAX(date2)
                       KEEP (DENSE_RANK FIRST ORDER BY t.center NULLS LAST)
              FROM   Tabla2 t 
              WHERE  t.articulo = r.articulo
              AND    (t.center = r.center OR t.center IS NULL)
              AND    t.date2 >= TRUNC(sysdate)
            );

注意:KEEP (DENSE_RANK LAST... 用于优先选择具有非 NULL 中心的行中的日期,而不是具有 NULL 中心的行。

其中,如果您有示例数据:

CREATE TABLE table1 (articulo, center, date1) AS
SELECT 1, 1, CAST(NULL AS DATE) FROM DUAL UNION ALL
SELECT 2, 2, NULL FROM DUAL UNION ALL
SELECT 3, 3, NULL FROM DUAL UNION ALL
SELECT 4, 4, NULL FROM DUAL;

CREATE TABLE tabla2 (articulo, center, date2) AS
SELECT 1, 1,    DATE '2023-05-19' FROM DUAL UNION ALL
SELECT 2, 2,    DATE '2023-01-01' FROM DUAL UNION ALL
SELECT 2, 2,    DATE '2023-05-19' FROM DUAL UNION ALL
SELECT 3, 3,    DATE '2023-01-01' FROM DUAL UNION ALL
SELECT 3, NULL, DATE '2023-05-19' FROM DUAL UNION ALL
SELECT 4, NULL, DATE '2023-01-01' FROM DUAL UNION ALL
SELECT 4, NULL, DATE '2023-05-19' FROM DUAL;

然后,更新后 Table1 包含:

ARTICULO CENTER DATE1
1 1 2023-05-19 00:00:00
2 2 2023-05-19 00:00:00
3 3 2023-01-01 00:00:00
4 4 2023-05-19 00:00:00

db<>fiddle here