SQL Server - обновление таблицы с использованием условия соединения [дубликат]

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

539
задан Andy Jones 8 January 2014 в 04:18
поделиться

10 ответов

UPDATE im
SET mf_item_number = gm.SKU --etc
FROM item_master im
JOIN group_master gm
    ON im.sku = gm.sku 
JOIN Manufacturer_Master mm
    ON gm.ManufacturerID = mm.ManufacturerID
WHERE im.mf_item_number like 'STA%' AND
      gm.manufacturerID = 34

Чтобы сделать это ясно ... Предложение UPDATE может ссылаться на псевдоним таблицы, указанный в предложении FROM. Таким образом, im в этом случае действительно

Общий пример

UPDATE A
SET foo = B.bar
FROM TableA A
JOIN TableB B
    ON A.col1 = B.colx
WHERE ...
1001
ответ дан Tim Biegeleisen 18 August 2018 в 09:20
поделиться
  • 1
    Postgres жалуется на UPDATE im; im - псевдоним, который Postgres не распознает: / – fatuhoku 10 November 2016 в 16:57
  • 2
    FYI это будет НЕ работать в MySQL (другой синтаксис)! Для MySQL взгляните на ответ gcbenison – Sliq 17 January 2017 в 17:28
  • 3
    очень полезный общий пример, спасибо! – Andrzej Martyna 6 June 2018 в 08:22

Адаптация этого к MySQL - в UPDATE нет предложения FROM, но это работает:

UPDATE
    item_master im
    JOIN
    group_master gm ON im.sku=gm.sku 
    JOIN
    Manufacturer_Master mm ON gm.ManufacturerID=mm.ManufacturerID
SET
    im.mf_item_number = gm.SKU --etc
WHERE
    im.mf_item_number like 'STA%'
    AND
    gm.manufacturerID=34
55
ответ дан Florent 18 August 2018 в 09:20
поделиться

Попробуйте это ...

Update t1.Column1 = value 
from tbltemp as t1 
inner join tblUser as t2 on t2.ID = t1.UserID 
where t1.[column1]=value and t2.[Column1] = value;
2
ответ дан JH_ 18 August 2018 в 09:20
поделиться

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

update item_master
set mf_item_number = (some value)
from 
   group_master as gm
   join Manufacturar_Master as mm ON ........
where
 .... (your conditions here)

В предложении WHERE вам необходимо предоставить условия и операции объединения для связывания этих таблиц.

Marc

7
ответ дан marc_s 18 August 2018 в 09:20
поделиться
  • 1
    ..или использовать ANSI JOINS в предложении FROM – gbn 11 June 2009 в 19:59
  • 2
    Да, пожалуйста, используйте ansi joins, вы можете быть в реальной беде в обновлении, если вы случайно получили крест. – HLGEM 11 June 2009 в 20:01

Один из самых простых способов - использовать общее табличное выражение (так как вы уже на SQL 2005):

with cte as (
select
    im.itemid
    ,im.sku as iSku
    ,gm.SKU as GSKU
    ,mm.ManufacturerId as ManuId
    ,mm.ManufacturerName
    ,im.mf_item_number
    ,mm.ManufacturerID
    , <your other field>
from 
    item_master im, group_master gm, Manufacturer_Master mm 
where
    im.mf_item_number like 'STA%'
    and im.sku=gm.sku
    and gm.ManufacturerID = mm.ManufacturerID
    and gm.manufacturerID=34)
update cte set mf_item_number = <your other field>

Механизм выполнения запроса самостоятельно выяснит, как обновить запись.

61
ответ дан Remus Rusanu 18 August 2018 в 09:20
поделиться
  • 1
    Отлично, использование CTE упрощает преобразование исходного SELECT в UPDATE – SteveC 14 June 2013 в 15:48
  • 2
    Работает, пока ваш запрос SELECT не имеет агрегатов, DISTINCT и т. Д. – Baodad 20 May 2015 в 23:41
  • 3
    Обычно я начинаю с точки с запятой, чтобы прервать предыдущий оператор (если есть). CTE камни! Простой дизайн сложных запросов / объединенных обновлений. Я постоянно использую это... – Adam W 17 December 2015 в 06:19

Не использовал ваш sql выше, но вот пример обновления таблицы на основе инструкции объединения.

UPDATE p
SET    p.category = c.category
FROM   products p
       INNER JOIN prodductcatagories pg
            ON  p.productid = pg.productid
       INNER JOIN categories c
            ON  pg.categoryid = c.cateogryid
WHERE  c.categories LIKE 'whole%'
9
ответ дан Suraj Shrestha 18 August 2018 в 09:20
поделиться
MySQL: In general, make necessary changes par your requirement:

UPDATE
    shopping_cart sc
    LEFT JOIN
    package pc ON sc. package_id = pc.id    
SET
    sc. amount = pc.amount
4
ответ дан Vinod Joshi 18 August 2018 в 09:20
поделиться

Вы можете обновить команду MERGE с гораздо большим контролем над MATCHED и NOT MATCHED :( Я немного изменил исходный код, чтобы продемонстрировать свою точку)

USE tempdb;
GO
IF(OBJECT_ID('target') > 0)DROP TABLE dbo.target
IF(OBJECT_ID('source') > 0)DROP TABLE dbo.source
CREATE TABLE dbo.Target
    (
      EmployeeID INT ,
      EmployeeName VARCHAR(100) ,
      CONSTRAINT Target_PK PRIMARY KEY ( EmployeeID )
    );
CREATE TABLE dbo.Source
    (
      EmployeeID INT ,
      EmployeeName VARCHAR(100) ,
      CONSTRAINT Source_PK PRIMARY KEY ( EmployeeID )
    );
GO
INSERT  dbo.Target
        ( EmployeeID, EmployeeName )
VALUES  ( 100, 'Mary' );
INSERT  dbo.Target
        ( EmployeeID, EmployeeName )
VALUES  ( 101, 'Sara' );
INSERT  dbo.Target
        ( EmployeeID, EmployeeName )
VALUES  ( 102, 'Stefano' );

GO
INSERT  dbo.Source
        ( EmployeeID, EmployeeName )
VALUES  ( 100, 'Bob' );
INSERT  dbo.Source
        ( EmployeeID, EmployeeName )
VALUES  ( 104, 'Steve' );
GO

SELECT * FROM dbo.Source
SELECT * FROM dbo.Target

MERGE Target AS T
USING Source AS S
ON ( T.EmployeeID = S.EmployeeID )
WHEN MATCHED THEN
    UPDATE SET T.EmployeeName = S.EmployeeName + '[Updated]';
GO 
SELECT '-------After Merge----------'
SELECT * FROM dbo.Source
SELECT * FROM dbo.Target
0
ответ дан Yashar Aliabasi 18 August 2018 в 09:20
поделиться
0
ответ дан blue-phoenox 6 September 2018 в 22:04
поделиться
0
ответ дан blue-phoenox 30 October 2018 в 03:04
поделиться