問題を解決するために技術者がクライアントの家にすでに派遣されているかどうかを調べるために、次の 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 を変更する方法を実際に見つけようとしています。