-1

我有以下 CTE 查询来查找技术人员是否已被派往客户家解决问题。

此表包含安装之间的关系数据。它告诉我安装 A 是否与 B 链接,然后如果 B 与 D 链接,从而使 A 和 D 链接。这可以针对 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 回答