799 Stimmen

SQL-Update-Abfrage mit Joins

Ich muss ein Feld mit einem Wert aktualisieren, der durch eine Verknüpfung von 3 Tabellen zurückgegeben wird.

select
    im.itemid
    ,im.sku as iSku
    ,gm.SKU as GSKU
    ,mm.ManufacturerId as ManuId
    ,mm.ManufacturerName
    ,im.mf_item_number
    ,mm.ManufacturerID
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

Ich möchte die mf_item_number Feldwerte der Tabelle item_master mit einem anderen Wert, der mit der obigen Bedingung verbunden ist.

Wie kann ich dies in MS SQL Server tun?

1430voto

gbn Punkte 407102
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

Um es deutlich zu machen... Die UPDATE Klausel kann sich auf einen Tabellenalias beziehen, der in der FROM Klausel. Also im ist in diesem Fall gültig

Allgemeines Beispiel

UPDATE A
SET foo = B.bar
FROM TableA A
JOIN TableB B
    ON A.col1 = B.colx
WHERE ...

93voto

gcbenison Punkte 11225

Wenn man dies an MySQL anpasst - es gibt keine FROM Klausel in UPDATE aber das funktioniert:

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

74voto

Remus Rusanu Punkte 280155

Eine der einfachsten Möglichkeiten ist die Verwendung eines allgemeinen Tabellenausdrucks (da Sie bereits SQL 2005 verwenden):

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>

Die Abfrageausführungsmaschine findet selbst heraus, wie der Datensatz zu aktualisieren ist.

15voto

Gratzy Punkte 9004

Haben Sie nicht Ihre Sql oben verwenden, aber hier ist ein Beispiel für die Aktualisierung einer Tabelle auf der Grundlage einer Join-Anweisung.

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%'

9voto

marc_s Punkte 701497

Sie können zusätzliche Tabellen angeben, die bei der Bestimmung, wie und was zu aktualisieren ist, mit der "FROM"-Klausel in der UPDATE-Anweisung verwendet werden, etwa so:

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

In der WHERE-Klausel müssen Sie die Bedingungen und Join-Operationen angeben, um diese Tabellen miteinander zu verbinden.

Marc

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X