2016-12-26 2 views
0

Ich habe nur 1 Spalte (p_id), die in beiden Tabellen Tablea und Tableb gemeinsam ist.Wie aktualisiert man eine Spalte in Tableb von Tablea, ohne eine andere Spalte als Identität zu verwenden?

In Tablea, p_id Werte sind 101 bis 109, und in Tableb, p_id Werte sind null.

Ich muss aktualisieren Tablebp_id Werte von Tableap_id Werte.

Wie kann ich das tun?

Ich habe unter Abfrage ausführen, aber es ohne eine andere Identitätsspalte nicht funktioniert:

update tableb set pid=(select tablea.pid from tablea) where tableb.id between 1 and 9; 

und es wird folgende Fehlermeldung zurück:

512 Nachricht Schweregrad 16, Status 1 Zeile 197 Unterabfrage ergab mehr als 1 Wert. Dies ist nicht zulässig, wenn die Unterabfrage folgt =,! =, <, < =,>,> = oder wenn die Unterabfrage als Ausdruck verwendet wird. Die Anweisung wurde beendet.

gibt es eine weitere Spalte ID in Tableb die Werte von 1 bis 9.

+0

Der Fehler sagt alles, Sie versuchen, mehr als "1" Wert zu pid von 'tableb' zu setzen. –

+2

Gibt es eine Beziehung zwischen den Tabellen? Wenn ja, bitte erwähnen Sie es. –

+0

Ja, p_id in tableb wird als Fremdschlüssel verwendet.Und ich möchte alle Werte von Tablea p_id in Tabelle p p_id –

Antwort

1

Versuchen Sie, wie unten

Schema wie Sie gesagt haben:

CREATE TABLE #TABLE_A (PID INT) 

INSERT INTO #TABLE_A 
SELECT 101 
UNION ALL 
SELECT 102 
UNION ALL 
SELECT 103 
UNION ALL 
SELECT 104 
UNION ALL 
SELECT 105 
UNION ALL 
SELECT 106 
UNION ALL 
SELECT 107 
UNION ALL 
SELECT 108 
UNION ALL 
SELECT 109 


CREATE TABLE #TABLE_B (ID INT, PID INT) 

INSERT INTO #TABLE_B 
SELECT 1, NULL 
UNION ALL 
SELECT 2, NULL 
UNION ALL 
SELECT 3, NULL 
UNION ALL 
SELECT 4, NULL 
UNION ALL 
SELECT 5, NULL 
UNION ALL 
SELECT 6, NULL 
UNION ALL 
SELECT 7, NULL 
UNION ALL 
SELECT 8, NULL 
UNION ALL 
SELECT 9, NULL 

nun die Table_B aktualisieren mit unten wie Anweisung

UPDATE #TABLE_B SET #TABLE_B.PID = T_A.PID 
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) SNO , PID FROM #TABLE_A 
)AS T_A 
INNER JOIN (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) SNO , ID, PID FROM #TABLE_B 
)AS T_B ON T_A.SNO = T_B.SNO 
WHERE #TABLE_B.ID = T_B.ID 

Methode 2: Aber fest einprogrammiert

UPDATE #TABLE_B SET #TABLE_B.PID = A.PID 
FROM #TABLE_A A 
INNER JOIN #TABLE_B B ON A.PID-100 = B.ID 
+0

Methode 2 ist ähnlich wie meine, aber macht nichts. – Susang

+0

Ich habe deine Antwort nicht beobachtet, wenn ich es versuche. Es tut uns leid. @Suraz –

+0

Methode 2 funktioniert nicht aber die Zeilen sind betroffen, aber beim Überprüfen des Status ist es immer noch Null. –

1

enthält Wir, die einfach aus JOIN erreichen kann, wird es Ihre NULLpid s aktualisieren von tableA

Diese Lösung ist es, Daten spezifisch und wir müssen einen Wert hinzufügen, um eine join für die Lösung zu haben

UPDATE b SET b.pid = a.pid 
FROM tableB b 
INNER JOIN tableA a ON a.pid = b.id+100 
WHERE b.pid IS NULL 

Ich denke PID null ist für ID 1 to 9 so in dem obigen Code wird es die NULL Werte überprüfen und entsprechend aktualisieren, aber wenn Sie möchten, können Sie nicht aktualisieren alle NULL Werte dann Bedingung hinzufügen in der WHERE als

AND b.id between 1 and 9; 

Bitte versuchen Sie eine Aktualisierung oben.

+0

hi @suraz Es funktioniert nicht für mich –

+0

@JasonClark bitte versuchen Sie die letzte Update-Abfrage. – Susang

Verwandte Themen