2017-07-06 4 views

Antwort

0

ich denke, das ist das, was Sie suchen:

UPDATE A 
    SET 
     A.DATE = GETDATE() 
FROM TableA AS A 
WHERE EXISTS 
(
    SELECT 1 
    FROM TableB AS B 
    WHERE B.userid = A.userid 
      AND B.planName = A.planName 
); 

dies wird alle Zeilen in der Tabelle A aktualisieren, die die genaue Kombination (en) haben von Benutzer-ID und Planname, die es gibt in Tabelle B

so dass, wenn Tabelle A hat die folgende:

userid planName 
1  A 
2  A 
1  B 

und Tabelle B hat die folgende

userid planName 
1  A 
1  B 

es nur die folgenden in Tabelle A aktualisiert:

userid planName 
1  A 
1  B 
+0

Ich habe zwei Reihen in meinem inneren wählen, aber wenn ich gehe Tabelle A aktualisieren es jede Zeile aktualisiert. –

+0

, wenn Sie laufen diese, wie viele Zeilen es zurückgibt: SELECT A. * VON TableA ALS WHERE VORHANDEN ( 1 SELECT VON TableB AS B WHERE B.userid = A.userid UND B.planName = A .planName ); –

+0

Das gibt alles von Tabelle A zurück. Was ich versuche zu tun, ist Tabelle A zu aktualisieren, wenn ich eine Benutzer-ID und einen Plan-Namen von einem separaten Select –

0

Sehen Sie, wenn diese ...

-- some test data... 
IF OBJECT_ID('tempdb..#TableA', 'U') IS NOT NULL 
DROP TABLE #TableA; 

CREATE TABLE #TableA (
    UserID INT NOT NULL, 
    PlanName VARCHAR(5) NOT NULL, 
    SomeDate DATE NULL, 
    PRIMARY KEY CLUSTERED (UserID) 
    ); 

IF OBJECT_ID('tempdb..#TableB', 'U') IS NOT NULL 
DROP TABLE #TableB; 

CREATE TABLE #TableB (
    UserID INT NOT NULL, 
    PlanName VARCHAR(5) NOT NULL, 
    PRIMARY KEY CLUSTERED (UserID, PlanName) 
    ); 

INSERT #TableA (UserID, PlanName) VALUES 
    (1, 'aaa'), (2, 'aab'), (3, 'abb'), 
    (4, 'aaa'), (5, 'aab'), (6, 'ccc'); 

INSERT #TableB (UserID, PlanName) VALUES 
    (1, 'aaa'), (1, 'abb'), (1, 'bbb'), 
    (2, 'aaa'), (2, 'abb'), (2, 'bbb'), 
    (3, 'aaa'), (3, 'abb'), (3, 'bbb'), 
    (4, 'aaa'), (4, 'abb'), (4, 'bbb'), 
    (5, 'aaa'), (5, 'abb'), (5, 'bbb'), 
    (6, 'aaa'), (6, 'abb'), (6, 'bbb'); 

--========================================= 

-- check initial values... 
SELECT * FROM #TableA ta; 
SELECT * FROM #TableB tb; 

-- written as a SELECT... 
SELECT 
    * 
FROM 
    #TableA ta 
WHERE 
    EXISTS (SELECT 1 FROM #TableB tb WHERE ta.UserID = tb.UserID AND ta.PlanName = tb.PlanName); 

    -- written as an UPDATE... 
UPDATE ta SET 
    ta.SomeDate = GETDATE() 
FROM 
    #TableA ta 
WHERE 
    EXISTS (SELECT 1 FROM #TableB tb WHERE ta.UserID = tb.UserID AND ta.PlanName = tb.PlanName); 

-- check updated values... 
SELECT * FROM #TableA ta; 
1
hilft

Die einfachste Methode ist, verbinden Sie diese beiden Tabellen in einer UPDATE Anweisung.

Versuchen Sie Folgendes:

UPDATE [Table A] 
SET DATE = GETDATE() 
FROM [Table A] a 
INNER JOIN [Table B] b on a.userid = b.userid and a.planName = b.planName 
0

Dies war in der Lage, es zu bekommen:

WITH CTE (userid, planName) 
AS (SELECT userid, planName From Table B) 
UPDATE A 
SET DATE = GETDATE() 
FROM Table A 
JOIN CTE B 
ON B.userid = A.userid AND B.planName = A.planName 
+0

Dies ist effektiv, was ich geantwortet habe, ohne den CTE. Zwar gibt es keinen Unterschied zwischen unseren Abfragen in Bezug auf die Aktualisierung der richtigen Datensätze, der CTE scheint jedoch eine längere Abfrage zu sein; etwas wortreicher. – Eli

Verwandte Themen