Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Мутный update  [new]
комит
Member

Откуда:
Сообщений: 99
Добрый день.

Как сделать update с join?
4 фев 20, 10:32    [22072440]     Ответить | Цитировать Сообщить модератору
 Re: Мутный update  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1455
комит,

по примеру из документации...
4 фев 20, 10:57    [22072458]     Ответить | Цитировать Сообщить модератору
 Re: Мутный update  [new]
entrypoint
Member

Откуда:
Сообщений: 227
комит,

JOIN напрямую нет, можно так

-- Тестовые данные
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
DROP TABLE IF EXISTS t3;

CREATE TEMPORARY TABLE t1 (id INT NOT NULL, value INT NOT NULL);
CREATE TEMPORARY TABLE t2 (id INT NOT NULL, value INT NOT NULL);
CREATE TEMPORARY TABLE t3 (id INT NOT NULL);

INSERT INTO t1 (id, value)
SELECT 1, 1 UNION ALL
SELECT 2, 1 UNION ALL
SELECT 3, 1 UNION ALL
SELECT 4, 1 UNION ALL
SELECT 5, 1 UNION ALL
SELECT 6, 1;

INSERT INTO t2 (id, value)
SELECT 1, 10 UNION ALL
SELECT 2, 11;

INSERT INTO t3 (id)
SELECT 1;

-- Обновить только те строки таблицы t1 которые есть в t2 и в t3 - значениями из t2 

-- I cпособ
UPDATE t1
	SET value = a.value
FROM (
		SELECT t1.id, t2.value FROM t1
			INNER JOIN t2 ON t1.id = t2.id
			INNER JOIN t3 ON t1.id = t3.id) AS a
WHERE a.id = t1.id;

-- II способ
WITH a AS 
(
	SELECT t1.id, t2.value FROM t1
		INNER JOIN t2 ON t1.id = t2.id
		INNER JOIN t3 ON t1.id = t3.id		
)
UPDATE t1
	SET value = a.value
FROM a 	
WHERE a.id = t1.id;

SELECT id, value FROM t1;
4 фев 20, 11:25    [22072485]     Ответить | Цитировать Сообщить модератору
 Re: Мутный update  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4071
entrypoint
комит,

JOIN напрямую нет, можно так



Что значит нет??? Вот на вашем же примере

UPDATE t1
SET value = t2.value
FROM t2
WHERE  t1.id = t2.id AND EXISTS (SELECT FROM t3 WHERE t3.id = t1.id);
4 фев 20, 16:27    [22072869]     Ответить | Цитировать Сообщить модератору
 Re: Мутный update  [new]
entrypoint
Member

Откуда:
Сообщений: 227
Maxim Boguk

Что значит нет??? Вот на вашем же примере


Насколько я понимаю, автор имеет в виду UPDATE в стиле MSSQL (T-SQL)

-- Тестовые данные
DECLARE  @t1 AS TABLE (id INT NOT NULL, [value] INT NOT NULL);
DECLARE  @t2 AS TABLE (id INT NOT NULL, [value] INT NOT NULL);
DECLARE  @t3 AS TABLE (id INT NOT NULL);

INSERT INTO @t1 (id, [value])
SELECT 1, 1 UNION ALL
SELECT 2, 1 UNION ALL
SELECT 3, 1 UNION ALL
SELECT 4, 1 UNION ALL
SELECT 5, 1 UNION ALL
SELECT 6, 1;

INSERT INTO @t2 (id, value)
SELECT 1, 10 UNION ALL
SELECT 2, 11;

INSERT INTO @t3 (id)
SELECT 1;

-- Обновить только те строки таблицы t1 которые есть в t2 и в t3 - значениями из t2 
UPDATE t1
  SET 
      [value] = t2.[value]
FROM @t1 AS t1
     INNER JOIN @t2 AS t2 ON t1.id = t2.id
     INNER JOIN @t3 AS t3 ON t1.id = t3.id;

SELECT id, [value] FROM @t1
4 фев 20, 16:52    [22072910]     Ответить | Цитировать Сообщить модератору
 Re: Мутный update  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4071
entrypoint,

Почти так же (если конечно primary key есть)

UPDATE t1
  SET 
      value = t2.value
FROM t1 AS _t1
     INNER JOIN t2 AS t2 ON _t1.id = t2.id
     INNER JOIN t3 AS t3 ON _t1.id = t3.id
WHERE _t1.id=t1.id;
4 фев 20, 19:46    [22073077]     Ответить | Цитировать Сообщить модератору
 Re: Мутный update  [new]
entrypoint
Member

Откуда:
Сообщений: 227
Maxim Boguk
entrypoint,

Почти так же (если конечно primary key есть)

UPDATE t1
  SET 
      value = t2.value
FROM t1 AS _t1
     INNER JOIN t2 AS t2 ON _t1.id = t2.id
     INNER JOIN t3 AS t3 ON _t1.id = t3.id
WHERE _t1.id=t1.id;


Согласен )))
5 фев 20, 10:10    [22073410]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить