Обновить два столбца из другой таблицы в одном запросе на сервере SQL? - PullRequest
0 голосов
/ 01 июля 2011

У меня есть 3 таблицы

Table1

     Sno   sname amount
       1     aaa   23
       2      bbb  34
      3      ccc   98

Table2

     sno   sprice
      1      34
      2      78
      3      87

Table3

     sno    amount    sprice
      1      65        78
      2      43        76
      3      34        45

Я хочу написать один запрос на обновление для сравнения таблиц table1 и table2 по сравнению с таблицей table3

sno.

Результат:

Table1

Sno   sname amount
   1     aaa   65
   2      bbb  43
  3      ccc   34

The Amount column value table3 is updated into table1 amount column.

Table2

 sno   sprice
  1      78
  2      76
  3      48

Значение sprice для table3 обновляется в столбце sprice для table2.

Thisдве операции можно сделать в одном запросе на обновление.

Если возможно, пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 01 июля 2011

Вы можете каскадно обновлять одну таблицу (см. Пример кода), используя первичные и внешние ключи;к сожалению, вы не можете сделать это с более чем одной таблицей из каждой исходной таблицы, если внешние ключи для двух целевых таблиц не совпадают (это также немного уродливо с точки зрения первичного ключа в исходной таблице !!).

Вы также можете использовать триггеры здесь (осторожно!).

Вот код для каскада из таблицы3 в таблицу1 в любом случае:

-- Set up Data
CREATE TABLE table1 (
    sno SMALLINT,
    sname VARCHAR(3),
    amount INT,
    CONSTRAINT PK_table1 PRIMARY KEY (
        sno,
        amount
    )
)

INSERT INTO table1 VALUES (1, 'aaa', 23)
INSERT INTO table1 VALUES (2, 'bbb', 34)
INSERT INTO table1 VALUES (3, 'ccc', 98)

CREATE TABLE table2 (
    sno SMALLINT,
    sprice INT,
    CONSTRAINT PK_table2 PRIMARY KEY (
        sno,
        sprice
    )
)

INSERT INTO table2 VALUES (1, 34)
INSERT INTO table2 VALUES (2, 78)
INSERT INTO table2 VALUES (3, 87)


CREATE TABLE table3 (
    sno SMALLINT,
    amount INT,
    sprice INT,
    CONSTRAINT PK_table3 PRIMARY KEY (
        sno,
        amount
    )
)

-- Data same as table1 and table2 for starting
INSERT INTO table3 VALUES (1, 23, 34)
INSERT INTO table3 VALUES (2, 34, 78)
INSERT INTO table3 VALUES (3, 98, 87)

-- Cascading updates between foreign keyed tables
ALTER TABLE table1 ADD CONSTRAINT FK_table1_table3 FOREIGN KEY (sno, amount) REFERENCES table3 (sno, amount) ON UPDATE CASCADE

-- Original Table 1
SELECT * FROM table1

-- Updates table 3 (cascades to table 1)
UPDATE table3
SET amount = 65,
    sprice = 78
WHERE sno = 1

UPDATE table3
SET amount = 43,
    sprice = 76
WHERE sno = 2

UPDATE table3
SET amount = 34,
    sprice = 45
WHERE sno = 3

-- Prove cascade
SELECT *
FROM table1

--Tidy Up
DROP TABLE table1
DROP TABLE table2
DROP TABLE table3
0 голосов
/ 01 июля 2011

Оператор UPDATE может влиять только на одну таблицу (кроме отдельных операторов, таких как те, которые могут содержаться в триггере). Почему бы просто не обернуть два оператора обновления в транзакцию? Какова цель попытки сделать это в одном утверждении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...