Oracle SQL - обновить 2 столбца в строке с самой старой датой - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь обновить 2 столбца подряд.Строка, которая должна быть обновлена, является строкой, имеющей самую старую duedate

Таблица пополнения описывается следующим образом:

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 CHOREID                                   NOT NULL NUMBER(38)
 GROUPID                                   NOT NULL NUMBER(38)
 DUEDATE                                   NOT NULL DATE
 COMPLETEDDATE                                      DATE
 COMPLETEDBY                                        NUMBER(38)

Этот запрос возвращает строку, которую я хочу обновить

select *
from 
(
        select choreid, duedate, row_number() 
        over (partition by choreid order by duedate) as rn 
        from chorecompletion where choreid = 12 and groupid = 6
)
where rn = 1;

Где я мог бы использовать некоторую помощь, это как использовать этот запрос в моем заявлении об обновлении, в частности, в моем предложении where

моя текущая попытка:

update chorecompletion 
set completeddate = sysdate, completedby=1
where --How to get the result of the previous query here?

Любая помощь помоя логика будет высоко оценена.

Пример желаемого результата:

До обновления:

CHOREID      GROUPID    DUEDATE     COMPLETEDDATE      COMPLETEDBY
-------------------------------------------------------------------
  12          6        2018-11-1
  12          6        2018-10-1

После обновления

CHOREID      GROUPID    DUEDATE     COMPLETEDDATE      COMPLETEDBY
-------------------------------------------------------------------
  12          6        2018-11-1 
  12          6        2018-10-1      2018-09-30            1

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Как то так?

SQL> create table test
  2  (choreid number,
  3   groupid number,
  4   duedate date,
  5   completeddate date,
  6   completedby number
  7  );

Table created.

SQL> insert into test
  2    select 12, 6, date '2018-01-11', null, null from dual union all
  3    select 12, 6, date '2018-01-10', null, null from dual;

2 rows created.

SQL> update test t set
  2    t.completeddate = sysdate,
  3    t.completedby = 1
  4  where t.duedate = (select min(t1.duedate)
  5                     from test t1
  6                     where t1.choreid = t.choreid
  7                       and t1.groupid = t.groupid)
  8    and t.choreid = 12
  9    and t.groupid = 6;

1 row updated.

SQL> select * From test;

   CHOREID    GROUPID DUEDATE    COMPLETEDD COMPLETEDBY
---------- ---------- ---------- ---------- -----------
        12          6 2018-01-11
        12          6 2018-01-10 2018-09-30           1

SQL>
0 голосов
/ 30 сентября 2018

Вы можете использовать оператор MERGE и присоединиться к псевдостолбцу ROWID, чтобы можно было напрямую соотнести его с соответствующей строкой: Скрипка SQL

Настройка схемы Oracle 11g R2 :

CREATE TABLE chorecompletion ( choreid, groupid, duedate, completeddate, completedby ) AS
  SELECT 12, 6, DATE '2018-09-29', CAST( null AS DATE ), CAST( null AS NUMBER ) FROM DUAL UNION ALL
  SELECT 12, 6, DATE '2018-09-30', null, null FROM DUAL;

Запрос 1 :

MERGE INTO chorecompletion dst
USING (
  SELECT ROWID AS rid
  FROM   (
    SELECT *
    FROM   chorecompletion
    WHERE  choreid = 12
    AND    groupid = 6
    ORDER BY duedate ASC
  )
  WHERE ROWNUM = 1
) src
ON ( src.RID = dst.ROWID )
WHEN MATCHED THEN
  UPDATE
  SET completeddate = sysdate,
      completedby   = 1

Результаты :

1 Row Updated.

Запрос 2 :

SELECT * FROM chorecompletion

Результаты :

| CHOREID | GROUPID |              DUEDATE |        COMPLETEDDATE | COMPLETEDBY |
|---------|---------|----------------------|----------------------|-------------|
|      12 |       6 | 2018-09-29T00:00:00Z | 2018-09-30T18:42:45Z |           1 |
|      12 |       6 | 2018-09-30T00:00:00Z |               (null) |      (null) |

Запрос 3 : Вы также можете использовать оператор UPDATE с псевдостолбцом ROWID:

UPDATE chorecompletion dst
SET    completeddate = sysdate,
       completedby   = 2
WHERE  ROWID = (
  SELECT ROWID
  FROM   (
    SELECT ROW_NUMBER() OVER ( PARTITION BY choreid ORDER BY duedate ) rn
    FROM   chorecompletion
    WHERE  choreid = 12
    AND    groupid = 6
    ORDER BY duedate ASC
  )
  WHERE rn = 1
)

Результаты :

1 Row Updated.

Запрос 4 :

SELECT * FROM chorecompletion

Результаты :

| CHOREID | GROUPID |              DUEDATE |        COMPLETEDDATE | COMPLETEDBY |
|---------|---------|----------------------|----------------------|-------------|
|      12 |       6 | 2018-09-29T00:00:00Z | 2018-09-30T18:42:45Z |           2 |
|      12 |       6 | 2018-09-30T00:00:00Z |               (null) |      (null) |
0 голосов
/ 30 сентября 2018

Вы можете использовать коррелированный подзапрос.Если я правильно понимаю:

update chorecompletion
    set completeddate = (select min(duedate)
                         from chorecompletion cc
                         where cc.choreid = chorecompletion.coreid
                        )
    where choreid = 12 and groupid = 6 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...