2017-01-23 3 views
1

Ich habe einige Beiträge hier darüber gelesen, aber ich verstehe überhaupt nicht.SQL Server - Unterabfrage zurückgegeben mehr als 1 Wert

In meinem Fall habe ich einen Tisch haben, sagen wir mal ‚Eltern‘ mit zwei Spalten ID, GESTRICHEN.

ID ist int und DELETED ist eine Bitspalte.

Ich habe eine andere Tabelle, sagen wir "Kind" mit Spalten ID, ID_PARENT, NAME, als Elterntabelle gelöscht.

ID und ID_PARENT sind int Name nvarchar ist DELETED ist ein bisschen

ich ein Auslöser für UPDATE auf dem Tisch Eltern erstellt haben, die Child-Tabelle aktualisiert:

UPDATE 
     [dbo].[Child] 
    SET 
     [DELETED] = I.[DELETED]   
    FROM 
     INSERTED I INNER JOIN [dbo].[Child] AS c 
     ON I.ID = c.ID_PARENT 
WHERE 
     c.[NAME] IS NOT NULL; 

Beachten Sie, dass ein Elternteil kann viele Kinder haben, und ein Kind nur ein Elternteil. So

wenn ich unten query:

UPDATE [dbo].[Parent] 
    SET DELETED = 1 
    WHERE ID IN (100, 200); 

Natürlich ist dies auf viele Zeilen auswirken wird. Ich bekomme unter Fehler:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

+3

Ihre Trigger prüfen - ich wette, dass Sie eine, die auf 'Update' läuft, die nur eine Zeile auf einmal aktualisiert wird davon ausgegangen, (zum Beispiel ist schlecht konzipiert) – Bridge

+0

@Bridge Sie richtig sind. Ich habe andere Auslöser überprüft, und es gibt einen auf der Tabelle Child, der den Fehler verursacht. Vielen Dank! – user1624552

+1

Kein Problem - bitte posten Sie eine Antwort auf diesen Effekt und akzeptieren Sie es, damit andere wissen, dass Ihre Frage gelöst ist :) – Bridge

Antwort

1

Obwohl Sie bereits Ihre Frage gelöst haben. Im Kommentarbereich haben Sie erwähnt, dass Sie ausgelöst am Kind ausgelöst haben. Aber für andere Community-Benutzer ist hier die vollständige Erstellung eines Szenarios mit Lösung möglich.

CREATE TABLE TempParent 
(
    ID INT, 
    DELETED BIT 
) 
GO 
CREATE TABLE TempChild 
(
    ID INT, 
    ID_PARENT int, 
    NAME varchar(100), 
    DELETED BIT 
) 

INSERT INTO TempParent 
SELECT 
    100,0 UNION ALL 
SELECT 
    200,0 UNION ALL 
SELECT 
    300,0 UNION ALL 
SELECT 
    400,0 
GO 
INSERT INTO TempChild 
SELECT 
    100,100,'Rahul',0 UNION ALL 
SELECT 
    200,200,'Rajesh',0 UNION ALL 
SELECT 
    300,300,'Anil',0 UNION ALL 
SELECT 
    400,400,NULL,0 

GO  
CREATE TRIGGER dbo.tr_TempParent 
ON dbo.TempParent 
FOR UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 
    UPDATE 
     [dbo].TempChild 
    SET 
     [DELETED] = I.[DELETED]   
    FROM 
     INSERTED I INNER JOIN [dbo].TempChild AS c 
     ON I.ID = c.ID_PARENT 
WHERE 
     c.[NAME] IS NOT NULL; 
END 
GO 
SELECT * FROM TempParent 

SELECT * FROM TempChild 

UPDATE [dbo].TempParent 
SET DELETED = 1 
WHERE ID IN (100, 200); 

DROP TABLE TempParent 
DROP TABLE TempChild 
+1

Ja, das ist das richtige Szenario. Mein Problem war, dass es einen anderen Auslöser gab, der ausgelöst wurde und dieser Auslöser davon ausging, dass nur eine Reihe auf einmal aktualisiert wurde. – user1624552

Verwandte Themen