2014-11-26 38 views
12

powiedzmy mam select, która zwraca mi tabela1:MySQL - wartości Aktualizacja oparta na podzapytanie

ID Name 
1 Bob 
2 Alice 
3 Joe 

Następnie chcę wartości Update w innej tabeli na podstawie tego wyniku:

UPDATE table2 SET Name = table1.Name WHERE ID = table1.ID 

As zrozumiałem, mogę tylko zrobić wewnętrzny wybierz w jednym miejscu, jak:

UPDATE table2 SET Name = (select Name from table1) WHERE ... 

I nie wiem jak to określić, gdzie klimatyzator .

+0

przechowywać je w zmiennej i przekazać je do aktualizacji – Haris

+0

@Harry że jest to zły pomysł, ponieważ będzie to ciąg oddzielonych przecinkami, które nie można używać na 'IN()' wszystko PO potrzebuje prostego łączenia. –

Odpowiedz

44

wszystkim należy zrobić, to dołączyć tabele jak ten.

UPDATE table2 t2 
JOIN table1 t1 ON t1.id = t2.id 
SET t2.name = t1.name; 

RESULTS WITH JOIN

jeśli są ustawione na robi to z select można zrobić to w ten sposób.

UPDATE table2 t2, 
( SELECT Name, id 
    FROM table1 
) t1 
SET t2.name = t1.name 
WHERE t1.id = t2.id 

RESULTS FROM SELECT

+0

To działało jak czar! Dzięki za cały cholerny los! –

-2

Spróbuj

Update table2 
Set Name = (Select Name From table1 where table1.ID = table2.ID) 
Where table2.ID In (Select ID From table1) 
+0

Co dobrego robi to w przypadku klauzuli? –

+0

@JohnRuddell, jeśli klauzula Where nie byłaby obecna, aktualizacja byłaby zastosowana do wszystkich wierszy w tabeli 2, niezależnie od tego, czy miały odpowiedni wiersz w tabeli1. W przypadku, gdy nie ma odpowiadającego wpisu, podkwerenda zwróci wartość zerową i to jest to, co zostanie użyte w aktualizacji, która byłaby zdecydowanie zła. Klauzula where sprawia, że ​​aktualizacja dotyczy tylko identyfikatorów, które faktycznie znajdują się w table1. – asantaballa

+0

Tak, ale oznacza to również, że robisz skorelowane podzapytanie dla każdego wiersza w drugiej tabeli wraz z innym skorelowanym podzapytaniem IN(). optymalizacja tego jest zła. dlaczego nie po prostu dołączyć do stołu? –

13
UPDATE table2 
SET name = (SELECT table1.Name FROM table1 WHERE table1.id = table2.id) 
WHERE apply_condition 

EDIT: # 1

UPDATE table2 t2, (SELECT id, name FROM table1) t1 SET t2.name = t1.name WHERE t1.id = t2.id 

proszę przeczytać link, another

+0

Wszelkie wyjaśnienia dotyczące downvote –

+0

Nie jestem downvoter, ale po to, abyś wiedział, że podzapytanie, które masz, jest skorelowanym podzapytaniem, co oznacza, że ​​zostanie wykonane dla każdego wiersza w tabeli2 ... co ogólnie jest złym projektem.a także gdzie po zestawu jest zbędny –

+0

@JohnRuddell dzięki za stosowanie .... ale używam podkwerenda ** SELECT table1.Name OD tabela1 GDZIE table1.id = table2.id ** I był używany jeden warunek, który jest table1.id = table2.id..thats znaczy najpierw sprawdzić table2.id i wtedy jest to zmiana .. –