-1

クエリが何をしているのかを理解しようとしていますが、なぜそれが複数の機会に自分自身に参加するのか理解できません。強調表示されたビットは、私が話している部分ですか?

[SupplyStatusUpdated] = COALESCE( ガス供給とガス供給履歴で始まる部分

                        USE [CRM];

        SELECT  gs.GasSupplyID, 
                [Account ID] = acc.AccountID,
                [GMSReference] = cast(gms.SiteRefNum as varchar),
                [AccountNumber] = cast(gms.AccountNum as varchar), 
                [Organisation Name] = prf.[Name] ,
                con.DeclaredDate, 
                [Contract Date] = CAST(con.ContractDate AS DATE),
                [Contract Version] = cv.Name,
                [Contract Status] = cs.Name,
                loa.ContractEndDate [LOA CED],
                gs.CurrentSupplierEndDate [PrevSupplierEndDate],
                loa.ContractEndDate,
                con.StartDate,
                [Supply Status] = gss.Name,
                [SupplyStatusUpdated] = COALESCE(
                                                    (   
                                                        SELECT TOP 1 MAX(gsh2.CreatedDate)
                                                        FROM GasSupply gs2 
                                                            INNER JOIN GasSupplyHistory gsh2 
                                                                ON gsh2.GasSupplyFK = gs2.GasSupplyID
                                                        WHERE gsh2.EventFK = 2 
                                                        AND gsh2.Notes LIKE '%Gas Supply Status (%'
                                                        AND gsh2.GasSupplyFK = gs.GasSupplyID
                                                        GROUP BY gsh2.GasSupplyFK
                                                    ),
                                                    (
                                                        SELECT TOP 1 MAX(gsh3.CreatedDate)
                                                        FROM GasSupplyHistory gsh3 
                                                            INNER JOIN  (
                                                                            SELECT gsh4.GasSupplyFK, MAX(gsh4.EventFK) AS [MaxEvent]
                                                                            FROM GasSupplyHistory gsh4
                                                                            WHERE gsh4.GasSupplyFK = gs.GasSupplyID
                                                                            GROUP BY gsh4.GasSupplyFK
                                                                            HAVING MAX(gsh4.EventFK) = 1
                                                                        ) dt 
                                                                ON dt.GasSupplyFK = gsh3.GasSupplyFK
                                                    )
                                                ),
                [EAC] = gs.EstimatedAnnualConsumption,
                [PreviousSupplier] = r.name,
                [Branch] = b.name,
                [LeadSource] = ls.name,
                gs.UnitPrice,
                gs.StandingCharge,
                gs.WholesalePrice,
                COALESCE(deal.weeknumber,DATEPART(ISOWK, con.[ContractDate])) AS [Week]
        FROM    acc.Account acc
            INNER JOIN [Profile] prf    
                ON acc.ProfileFK = prf.ProfileID
            INNER JOIN [Contract] con       
                ON acc.AccountID = con.AccountFK
            INNER JOIN [loacontract] lo
                ON lo.ContractFK = con.ContractID
            LEFT join [LeadSource] ls
                ON ls.LeadSourceID = con.LeadSourceFK
            INNER JOIN [ContractStatus] cs
                ON cs.ContractStatusID = con.ContractStatusFK 
            INNER JOIN [ContractVersion] cv
                ON cv.ContractVersionID = con.ContractVersionFK 
            INNER JOIN GasSupply gs
                ON gs.ContractFK = con.ContractID
            INNER JOIN GasSupplyStatus gss
                ON gss.GasSupplyStatusID = gs.GasSupplyStatusFK 
            LEFT JOIN Deal deal
                ON deal.ContractFK = con.ContractID
            OUTER APPLY GetGMSReferenceNumbers(con.ContractID) gms
            LEFT JOIN Branch b
                ON b.BranchID = deal.BranchFK
            LEFT JOIN DealBroker bro
                ON  bro.DealFK = deal.DealID
                AND bro.BrokerTypeFK = 36
            LEFT JOIN Person p
                ON p.PersonID = bro.EmployeeFK
            LEFT JOIN Reseller r
                ON r.ResellerID = gs.ResellerFK
            LEFT JOIN   (
                            SELECT  l.contractfk,
                                    MIN(l.contractenddate)[ContractEndDate]
                            FROM    CRM.[contract].LOAContract l
                            GROUP BY l.ContractFK       
                        ) loa
                ON loa.ContractFK = con.ContractID

        WHERE acc.AccountID not in  (
                                        select AccountFK 
                                        from AccountOption 
                                        where OptionFK=9
                                    )
        AND  cast(gms.SiteRefNum as varchar) IS NULL
4

3 に答える 3

1

COALESCE(Something, SomethingElse)最初の引数が NULL の場合、2 番目の引数を返します (2 つ以上の引数を持つことができ、リストの下に移動し続けることに注意してください)。

そのため、最初のサブクエリが実行され、結果が NULL の場合は 2 番目のクエリの結果が返されます。なぜ正確にあなたのビジネスロジックなのか、私たちは答えることができません:-)

( Coalesce の MSDN リンク)

于 2013-08-09T11:01:37.957 に答える
0

COALESCE最初に見つかった null 以外の値をGasSupply返すため、クエリが結果を返す場合はそれを使用します。それが null を返す場合は、GasSupplyHistoryクエリが結果を返すかどうかを確認し、そうであればそれを使用します。両方のクエリが null を返す場合、nullSupplyStatusUpdatedになります。

于 2013-08-09T11:01:21.093 に答える
0

それ自体に結合して、現在のレコードを取得するのと同じソースから履歴レコードを取得します。

履歴データの表現は、SQL/リレーショナル データベースの代わりに BigData/NoSQL データベースを使用する一般的な理由の 1 つです。

于 2013-08-09T11:15:48.157 に答える