2
4

3 に答える 3

0

このような複雑なクエリがある場合は、更新する行のみを生成する「単純な」選択を作成することから始めます。

また、更新されたテーブルの更新値とpkの両方を返す必要があります

次に、これを(内部で)更新するテーブルと結合し、更新の記憶を行って、次のように一致する行のみを更新するのは(比較的)簡単です。

WHERE tblTobeUpdated.pk = SimpleSelect.pk

お役に立てれば

于 2012-12-11T17:11:34.560 に答える
0

これを詳しく調べる時間はありませんが、少なくとも修正したいと思われます。

  WHERE DelivaryFlight. FlightDt >  DelivaryFlight. FlightDt

これは決して満たすことのできない条件です。

あなたはおそらく欲しい:

  WHERE DF. FlightDt > DF2. FlightDt

更新が更新されるレコードを確認できるようにすることは、これらの複雑なクエリでも役立ちます。そのため、通常は次のようにします。

Update
     Set …
--Select *
    FROM TableAct AC

次に、更新を実行する代わりに、 select で始まる部分を強調表示して実行し、結果を確認します。選択するレコードを選択していることと、値が表示されることを確認するまで、更新をテストしません交換は正しいです。

于 2012-12-11T20:05:38.810 に答える
0

クエリを分解してみてください。今日書いたクエリです。各部分を個別にテストします

SELECT
    Employee
    , Reference
    , Payroll
    , [Hours] / 60 
    [Hours]
    , [Days]
FROM
    (
    SELECT
        Employee
        , Reference
        , Payroll
        , SUM( Duration ) AS [Hours]
        , AvailableID
    FROM
        (
        SELECT
            RequirerID
            , Duration
            , RTRIM( COALESCE(MA.MemberLastName, '') 
                + ' ' + COALESCE(MA.MemberFirstName, '')  
                + ' ' + COALESCE(MA.MemberInitial, '')) Employee
            , COALESCE(MA.Detailref1, '') Reference
            , COALESCE(MA.PayrollRef, '') Payroll
            , Available.AvailableId 
        FROM
            (
            SELECT DISTINCT
                RequirerID
                , ShiftDate
                , CAST(ShiftStart - ShiftEnd - ShiftBreak AS DECIMAL(19,2)) ShiftDuration
                , Id RequirementRecordID
            FROM
                Requirements
            WHERE
                Requirements.ShiftDate BETWEEN @ParamStartDate
                AND @ParamEndDate
                AND RequirerID IN (SELECT ID FROM MemberDetails WHERE CompanyID = @ParamCompanyID)
            )
            R
            INNER JOIN
            ShiftConfirmed
            INNER JOIN
            Available
            INNER JOIN
            MemberDetails MA
            ON Available.AvailableID = MA.ID
            ON ShiftConfirmed.AvailableRecordID = Available.ID
            ON R.RequirementRecordID = ShiftConfirmed.RequirementRecordID
        WHERE
            R.ShiftDate BETWEEN @ParamStartDate
            AND @ParamEndDate
            AND COALESCE(ShiftChecked, 0) BETWEEN 0 AND 1
        )
        ShiftDay
    Group By
        Employee
        , Reference
        , Payroll
        , AvailableId
    ) Shifts
    INNER JOIN
    (
    SELECT
        COUNT( * ) AS [Days]
        , AvailableID
    FROM
        (
        SELECT DISTINCT
            R.ShiftDate
            , Available.AvailableId 
        FROM
            (
            SELECT DISTINCT
                ShiftDate
                , Id RequirementRecordID
            FROM
                Requirements
            WHERE
                Requirements.ShiftDate BETWEEN @ParamStartDate
                AND @ParamEndDate
                AND RequirerID IN (SELECT ID FROM MemberDetails WHERE CompanyID = @ParamCompanyID)
            )
            R
            INNER JOIN
            ShiftConfirmed
            INNER JOIN
            Available
            INNER JOIN
            MemberDetails MA
            ON Available.AvailableID = MA.ID
            ON ShiftConfirmed.AvailableRecordID = Available.ID
            ON R.RequirementRecordID = ShiftConfirmed.RequirementRecordID
        WHERE
            R.ShiftDate BETWEEN @ParamStartDate
            AND @ParamEndDate
            AND COALESCE(ShiftChecked, 0) BETWEEN 0 AND 1
        )
        ShiftDay
    Group By
        AvailableId
    ) D
    ON Shifts.AvailableID = D.AvailableID

WHERE [Hours] > 0
ORDER BY
    Employee
于 2012-12-13T09:14:14.653 に答える