-1

問題を解決するために技術者がクライアントの家にすでに派遣されているかどうかを調べるために、次の CTE クエリがあります。

このテーブルには、インストール間のリレーショナル データが含まれています。インストール A が B にリンクされている場合、B が D にリンクされている場合は、A と D がリンクされていることがわかります。これは、1 つの大きなリレーショナル スキームを作成するために、90 の異なるエントリに対して実行できます。

INIR_Id : ID

INIR_INST_Id : インストール ID

INIR_INRE_Id 関係 ID

INIR_Date : リレーションが追加された日付。

CREATE TABLE [dbo].[CPL_t_Installations_InstallationsRelations](
    [INIR_Id] [bigint] IDENTITY(1,1) NOT NULL,
    [INIR_INST_Id] [int] NOT NULL,
    [INIR_INRE_Id] [bigint] NOT NULL,
    [INIR_Date] [datetime] NOT NULL,
 CONSTRAINT [PK_CPL_t_Installations_InstallationsRelations] PRIMARY KEY CLUSTERED 
(
    [INIR_Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


WITH Tempou(Relation,Installation,Date,Origine)AS
(
    (
        SELECT
            INIR_INRE_Id,
            INIR_INST_Id,
            INIR_Date,
            1
        FROM
            CPL_t_Installations_InstallationsRelations
        WHERE
            (INIR_INST_Id=@INST_Id)
    )
    UNION ALL
    (
        SELECT
            INIR_INRE_Id,
            INIR_INST_Id,
            INIR_Date,
            0
        FROM
            CPL_t_Installations_InstallationsRelations
                INNER JOIN Tempou Alpha ON(Relation=INIR_INRE_Id)
        WHERE
            (INIR_Date<Date)
            AND NOT
            (
                (Installation=INIR_INST_Id)
                AND
                (Relation=INIR_INRE_Id)
            )
    )
)
SELECT TOP * FROM Tempou;

クエリの問題は、CTE 結果セットに存在するすべての日付にループバックすることです。その後、すべての結果が何度も複製されます。日付を監視データとして無数の時間から128エントリの結果セットまで作成しました。しかし、DISTINCT を使用して Tempou からすべてをクエリすると、正しい数である 14 の結果が得られます。せいぜい日付データを除いて、階層データはありません。

無制限の結果から128までの結果はかなり良いですが、それは答えではありません。私はかなり疲れていて、この問題の明らかな点が見えていないのかもしれません。私に見えないものを皆さんに尋ねさせてください。

Ps .: 例として共有するデータはありませんが、結果の「レベル」の数に制限はありません。2 つのレベルを持つクライアントもあれば、20 レベルを持つクライアントもあるかもしれません。また、リンクされたデータはもちろん対称ではありません。 「根」は他のものより短いかもしれません。

ありがとうございました!

ちょっとした追加ですが、「Tempou」を使用して「NOT EXISTS」を実行できれば問題は解決しますが、すべてのエントリを複製する CTE では不可能です。そのため、その動作を再現できるように CTE を変更する方法を実際に見つけようとしています。

4

1 に答える 1

0

@Rv3、最初SELECT TOP * FROM Tempouはコンパイルされませんでしたが、タイプミスとして残します

簡単な質問ですが、あなたの CTE は無限ループに陥っていますか? JOIN でそれらを切り替えてみて、それが機能するかどうかを確認してください。それ以外の

FROM
            CPL_t_Installations_InstallationsRelations
                INNER JOIN Tempou Alpha ON(Relation=INIR_INRE_Id)
        WHERE
            (INIR_Date < Date)
            AND NOT
            (
                (Installation=INIR_INST_Id)
                AND
                (Relation=INIR_INRE_Id)
            )

試す

FROM
            Tempou Alpha 
                INNER JOIN  (Select * from  CPL_t_Installations_InstallationsRelations 
                            WHERE
            (INIR_Date < Date)
            AND NOT 
            (
                (Installation=INIR_INST_Id)
                AND
                (Relation=INIR_INRE_Id)
            )
            ) temp_tab
            ON(Relation=temp_tab.INIR_INRE_Id)

明らかに私はこれを実行しようとはしていないので、動作させるために少し修正する必要がある場合は申し訳ありません.

于 2013-01-21T12:01:37.070 に答える