2017-01-23 22 views
1

ここでいくつかの記事を読んでいますが、わかりません。SQL Server - サブクエリが1つ以上の値を返しました

私の場合は、テーブルを持っている、の2つの列IDと「親」としましょう、を削除しました。

IDはintで、DELETEDはビット列です。

私は別のテーブルを持っています。列ID、ID_PARENT、NAME、親テーブルとして削除された 'Child'としましょう。

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; 

片親ことに留意してください:

IDとID_PARENTはint型 NAMEは、nvarchar型 DELETEDは、子テーブルを更新し、私はテーブルの親のUPDATEのトリガーを作成している

ビットにあるあるあります多くの子供を持つことができ、1人の子供は親を1人しか持たない。

は、だから私は、クエリの下に行うとき:もちろん

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

、これは多くの行に影響します。私は以下のエラーを受け取ります:

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

+3

はあなたのトリガーを確認してください - 私はあなたが正しいです@Bridgeあなたが(例えば、設計が不十分な場合)のみ1行が一度に更新されると仮定したUpdate' '上で動作する1 – Bridge

+0

を持って賭けます。私は他のトリガーをチェックしており、エラーの原因となっているテーブルChildに1つあります。ありがとう! – user1624552

+1

問題ありません - その旨の回答を投稿して受け入れてください。他の人があなたの質問が解決されていることを知ってください:) – Bridge

答えて

1

あなたの質問は既に解決されていますが、コメント欄には、あなたが子供の上で作成されたことが記載されています。しかし、他のコミュニティユーザにとっては、ソリューションを使った完全なシナリオ作成です。

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

はいこれは正しいシナリオです。私の問題は、もう1つのトリガーが発生していて、このトリガーは一度に1つの行しか更新されていないと仮定していました。 – user1624552

関連する問題