2012-03-28 4 views
0
mysql> SELECT Ext, Pass, Name, Context FROM temp_Users WHERE temp_Users.Pass NOT IN (SELECT Pass FROM Users); 
+------+-------+---------+------------+ 
| Ext | Pass | Name | Context | 
+------+-------+---------+------------+ 
| 6003 | Hello | WebPone | DLPN_Admin | 
+------+-------+---------+------------+ 
1 row in set (0.00 sec) 


mysql> UPDATE Users 
    -> SET (Pass, Name, Context) = (SELECT Pass, Name, Context FROM temp_Users WHERE temp_Users.Pass NOT IN (SELECT Pass FROM Users)) 
    -> WHERE Users.Ext = temp.Ext; 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(Pass, Name, Context) = (SELECT Pass, Name, Context FROM temp_Users WHERE temp_' at line 2 

Ich möchte meine Datenbank von Wählen Sie Ergebnis und ich bekomme diesen Fehler. Bitte sag mir, wie ich es lösen kann?Aktualisieren Sie meine Datenbank von Wählen Sie Ergebnis

+2

Nicht zu unhöflich sein, aber dein Versuch war nicht einmal nahe. Es sieht so aus, als hätten Sie geschrieben, was Sie von der Syntax erwarten würden [anstatt zu überprüfen, was die tatsächliche Syntax ist] (http://dev.mysql.com/doc/refman/5.0/en/update.html) ... –

+1

@MichaelFredrickson: In aller Fairness gibt es einige DBMSes, die eine Syntax ähnlich wie die OPs unterstützen. Wenn er nach "SQL" Update-Statements statt nach "MySQL" Update-Statements gegoogelt hat, dann hätte er mit so etwas enden können. (Nicht jeder weiß, wie unterschiedlich die verschiedenen SQL-Dialekte sein können.) – ruakh

+0

@ruakh Interessant, ich stehe korrigiert. Nur für meine Neugier, wissen Sie, welche SQL-Dialekt (e) erlaubt das? –

Antwort

3

MySQL unterstützt nicht die SET (multiple_fields) = (subquery_that_returns_multiple_fields) Syntax für UPDATE Aussagen. Stattdessen müssen Sie ein "multiple-table" Update (ein Join) verwenden. Siehe http://dev.mysql.com/doc/refman/5.6/en/update.html.

Ihre Abfrage hat einige andere Probleme, so dass ich nicht klar bin genau was Sie wollen. . . aber ich denke du willst so etwas:

UPDATE users 
    JOIN temp_users 
    ON temp_users.ext = users.ext 
    SET users.pass = temp_users.pass, 
     users.name = temp_users.name, 
     users.context = temp_users.context 
WHERE temp_users.pass NOT IN 
     -- extra subquery to bypass MySQL limitation: 
     (SELECT pass 
      FROM (SELECT pass 
        FROM users 
       ) t 
     ) 
; 
+0

+1 @ruakh, Sie hatten Recht in beiden Punkten ... Sie müssen das Präfix auf der linken Seite haben, sonst beschwert es sich, dass es mehrdeutig ist, und Sie müssen die zusätzliche Unterabfrage für die "IN" hinzufügen. –

+0

@ruakh Vielen Dank Herr, Ihre Antwort hat meine Arbeit gemacht :) –

+0

@ArhamAliQureshi: Gern geschehen! – ruakh

2
UPDATE Users u 
JOIN temp_Users tu ON tu.Ext = u.Ext 
SET 
    Pass = tu.Pass, 
    Name = tu.Name, 
    Context = tu.Context 
WHERE tu.Pass NOT IN (
    SELECT Pass 
    FROM Users 
) 
+0

Sir, wenn ich nicht nur Passwortänderungen bewahre, muss ich auch auf Name und Kontext achten, was soll ich dann tun? –

+1

Sind Sie sicher, dass Sie einfach z. 'Pass = tu.Pass' anstatt' u.Pass = tu.Pass'? Das erscheint mir seltsam. Und sind Sie sicher, dass Sie 'NOT IN '(SELECT Pass FROM Users)' auf der obersten Ebene haben können, wenn 'Users' eine der aktualisierten Tabellen ist? Die Dokumentation besagt, dass "Sie derzeit keine Tabelle aktualisieren und aus derselben Tabelle in einer Unterabfrage auswählen können". – ruakh

+0

@ruakh Gute Fragen, ich werde überprüfen. Ich weiß, dass es in SQL Server tatsächlich einen Fehler auslöst, wenn Sie versuchen, der linken Seite der Zuordnung in einem Update voranzukommen, aber nicht sicher über MySql. Ich werde auch die Gültigkeit des 'IN's überprüfen. –

Verwandte Themen