簡體   English   中英

使用單個列從另一個表更新一個表中的多個列?

[英]Updating several columns in one table from another table with a single column?

表 A 看起來像這樣: 在此處輸入圖片說明

表 B 看起來像這樣: 在此處輸入圖片說明

使用 TABLE AI 需要更新 TABLE B 中的單行,並使用 TABLE A 中的 DATETIME 列獲取 TABLE B 中每一列的值(忽略 TABLE B 單條記錄中顯示的狀態)。 所以從表A的三條記錄中,我只需要一條記錄,把與對應STATUS匹配的日期,如果沒有找到狀態,把表B中的日期改為:'2999-12-31 23 :59:5'

 when status = 'CLAIMED' put DATETIME in CLAIMED_DATETIME
 when status = 'BOUGHT' put DATETIME in BOUGHT_DATETIME
 when status = 'RETURNED' put DATETIME in RETURNED_DATETIME

我嘗試了這個查詢,但它只更新了第一列,而沒有更新其余的列。

UPDATE TABLE B a
SET
    CLAIMED_datetime = IFF(STATUS='claimed', DATETIME, '2999-12-31 23:59:5'),
    BOUGHT_datetime = IFF(STATUS='bought', DATETIME, '2999-12-31 23:59:5'),
    RETURNED_datetime = IFF(STATUS='returned', DATETIME, '2999-12-31 23:59:5'),
FROM TABLE A SRC
WHERE a.number_id = SRC.number_id
and a.country= SRC.country

我需要表 B 看起來像這樣: 在此處輸入圖片說明

有誰知道查詢有什么問題或如何做到這一點?

只有第一個更新的原因是因為一旦我們匹配了該行,它就不會再次更新,即使 JOIN 導致返回 3 行。 第一行的狀態為 CLAIMED,並且它被更新,然后其余兩個匹配的行將被忽略。

正如帕特里克提到的,我們可以嘗試使用 PIVOT 函數將表 A 中的 3 行減少到一行,並在其自己的列上顯示狀態。

下面的查詢假設每個 number_id 和國家只有一個 DATETIME 值:

create or replace table a (
    number_id int, country varchar, status varchar, datetime date
);
insert into a values 
(121144, 'USA', 'CLAIMED', '2021-10-10'),
(121144, 'USA', 'BOUGHT', '2021-10-11'),
(121144, 'USA', 'RETURNED', '2021-10-12'),
(121144, 'AU', 'CLAIMED', '2021-09-10'),
(121144, 'AU', 'BOUGHT', '2021-09-11');

create or replace table b (
    number_id int, country varchar, status varchar, 
    claimed_date date, bought_date date, returned_date date
);
insert into b values 
(121144, 'USA', 'RETURNED', '2999-12-31', '2999-12-31', '2999-12-31'),
(121144, 'AU', 'BOUGHT', '2999-12-31', '2999-12-31', '2999-12-31');



MERGE INTO B
USING (
    SELECT * FROM A 
    PIVOT(MIN(DATETIME) FOR STATUS IN ('CLAIMED', 'BOUGHT', 'RETURNED')) 
     AS P (NUMBER_ID, COUNTRY, CLAIMED, BOUGHT, RETURNED)
) A ON (A.NUMBER_ID = B.NUMBER_ID and A.COUNTRY = B.COUNTRY)
WHEN MATCHED THEN
  UPDATE SET
    B.CLAIMED_DATE = IFF(A.CLAIMED IS NOT NULL, A.CLAIMED, '2999-12-31 23:59:5'),
    B.BOUGHT_DATE = IFF(A.BOUGHT IS NOT NULL, A.BOUGHT, '2999-12-31 23:59:5'),
    B.RETURNED_DATE = IFF(A.RETURNED IS NOT NULL, A.RETURNED, '2999-12-31 23:59:5');

合並前:

+-----------+---------+----------+--------------+-------------+---------------+
| NUMBER_ID | COUNTRY | STATUS   | CLAIMED_DATE | BOUGHT_DATE | RETURNED_DATE |
|-----------+---------+----------+--------------+-------------+---------------|
|    121144 | USA     | RETURNED | 2999-12-31   | 2999-12-31  | 2999-12-31    |
|    121144 | AU      | BOUGHT   | 2999-12-31   | 2999-12-31  | 2999-12-31    |
+-----------+---------+----------+--------------+-------------+---------------+

合並后:

+-----------+---------+----------+--------------+-------------+---------------+
| NUMBER_ID | COUNTRY | STATUS   | CLAIMED_DATE | BOUGHT_DATE | RETURNED_DATE |
|-----------+---------+----------+--------------+-------------+---------------|
|    121144 | USA     | RETURNED | 2021-10-10   | 2021-10-11  | 2021-10-12    |
|    121144 | AU      | BOUGHT   | 2021-09-10   | 2021-09-11  | 2999-12-31    |
+-----------+---------+----------+--------------+-------------+---------------+

如果狀態是固定的,即只有 CLAIMED、BOUGHT 和 RETURNED 的值,也許您可​​以重新設計您的表以將它們放入列中?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM