2

以下を格納するテーブルがあります。

JobID
ValidationItemID
CreatedBy

このテーブル(事前定義されたテンプレート)に挿入できるようにしたいのですが、存在しない行のみを追加します。存在しないということは、JobIDとValidationItemIDの組み合わせによって行が一意になることを意味します。プロシージャはJobIDを渡しますが、この列をテンプレートの一部としてプルするため、検証アイテムIDを渡すことができません...

この効果への何か:

CREATE PROCEDURE insTemplate 
    @JobID varchar(50),
    @Login varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    INSERT INTO
            ValidationItemSignOff
                (
                    JobID,  
                    ValidationItemID,
                    CreatedBy
                )

        SELECT 
        DISTINCT
            @JobID,
            vi.ValidationItemID,
            @Login
        FROM
            RunOffAnswer roa
        INNER JOIN
            Method m ON m.MethodID = roa.MethodID
        INNER JOIN
            RunOffValidationItem vi ON vi.ValidationItemID = m.ValidationItemID
        WHERE
            vi.Inactive=0
            AND NOT EXISTS(SELECT * FROM ValidationItemSignOff WHERE JobID=@JobID AND vi.ValidationItemID ???
END
GO

同じJobIDとValidationItemIDが再挿入されないように、where条件を表現する方法がわかりません。私がテーブルの中にいるとしましょう:

Job      ValidationItem
Job A          1
Job A          2
Job A          5

そして、私は次のテンプレートを持っています:

ValidationItem
1
2
3
4
5
6

ストアドプロシージャを実行すると、ジョブIDの値3,4,6のみがテンプレートテーブルから挿入されるはずです...したがって、where条件についてサポートが必要です。

私の問題は使用できないことだと思いますNOT EXISTS。おそらく、このValidationItemSignOffテーブル自体に再度参加する必要があり、JobIDNULLは次のようになります。ValidationItemIDValidationItemID

CREATE PROCEDURE insTemplate 
    @JobID varchar(50),
    @Login varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    INSERT INTO
            ValidationItemSignOff
                (
                    JobID,  
                    ValidationItemID,
                    CreatedBy
                )

        SELECT 
        DISTINCT
            @JobID,
            vi.ValidationItemID,
            @Login
        FROM
            RunOffAnswer roa
        INNER JOIN
            Method m ON m.MethodID = roa.MethodID
        INNER JOIN
            RunOffValidationItem vi ON vi.ValidationItemID = m.ValidationItemID
        RIGHT OUTER JOIN
            ValidationItemSignOff viso ON viso.JobID = @JobID
                  AND viso.ValidationItemID = vi.ValidationItemID
        WHERE
            vi.Inactive=0
            AND viso.ValidationItemID IS NULL
END
GO

わかったと思う

右の結合をこれに置き換える:

LEFT JOIN
        ValidationItemSignOff viso
        ON  viso.JobID = @JobID
        AND viso.ValidationItemID = vi.ValidationItemID
4

2 に答える 2

1

2008年以降の場合...

MERGE INTO ValidationItemSignOff As Target
USING (SELECT DISTINCT @JobID, vi.ValidationItemID, @Login
         FROM RunOffAnswer roa INNER JOIN 
              Method m
           ON m.MethodID = roa.MethodID INNER JOIN
              RunOffValidationItem vi
           ON vi.ValidationItemID = m.ValidationItemID
        WHERE vi.Inactive = 0) As Source (JobID, ValidationItemID, Login)
   ON Target.JobID = Source.JobID 
  AND Target.ValidationItemID = Source.ValidationItemID
 WHEN NOT MATCHED BY TARGET THEN
      INSERT (JobID, ValidationItemID, CreatedBy)
      VALUES (Source.JobID, Source.ValidationItemID, Source.Login);

免責事項:ここで構文スポットを取得していない可能性があります。

于 2012-06-28T12:41:18.653 に答える
0

私はこれでそれを得ました:

ALTER PROCEDURE insSignOffTemplate 
    @JobID varchar(50),
    @Login varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    INSERT INTO
            ValidationItemSignOff
                (
                    JobID,  
                    ValidationItemID,
                    CreatedBy
                )

        SELECT 
        DISTINCT
            @JobID,
            vi.ValidationItemID,
            @Login
        FROM
            RunOffAnswer roa
        INNER JOIN
            Method m
        ON
            m.MethodID = roa.MethodID
        INNER JOIN
            RunOffValidationItem vi
        ON
            vi.ValidationItemID = m.ValidationItemID
        LEFT JOIN
        ValidationItemSignOff viso
        ON  viso.JobID = @JobID     AND viso.ValidationItemID = vi.ValidationItemID
        WHERE
            vi.Inactive=0
            AND viso.ValidationItemID IS NULL
END
GO
于 2012-06-28T12:53:55.803 に答える