使用交叉APPLY或CROSS-JOIN时SQL Server 2012查询返回重复的行

时间:2019-02-25 03:40:02

标签: sql sql-server database cross-join

更新此帖子以提高清晰度。

以下问题归因于CROSS-APPLY(我也很难进行CROSS-JOIN),但是我找不到使用内部联接或分区方式的简单方法

  1. 使每条记录都是唯一的-无重复,并且

2)确保每个唯一记录的顺序都... 174..175、176、177等。我希望这里有大约3200条记录,而不是我所得到的174000 ish。

有人可以提供我可以做些什么以确保我能按顺序获得记录吗?谢谢社区!查看代码和数据。

执行以下查询后-得到以下结果。如您在下面的数据中看到的,如果我通过合同订购,我会得到重复-我不应该将其与为每个交叉申请生成的ID关联。交叉应用导致生成具有不同ID的同一记录的这些重复项-一旦使用ID创建了记录,该记录的工作方式应该是该记录的唯一实例。

我还以粗体突出显示了代码的某些部分,这些部分使我获得的行ID紧随于上一所选行的ID的最新最大实例之后-但导致我重复。

因此,为了设置期望-子选择的下面的图像告诉我引用逻辑的表中已经存在的内容-告诉我不存在的内容

173 records - see image

下一张图片告诉我,我的整个查询都在选择不存在的内容并生成从第174行开始的记录-很好,但是我很震惊,我收到了多少记录-只有3875个不同的合同所以我应该只会获得3875条记录-而不是您所看到的174ish。

Way too many records - see image

因此,我按Contract_TaskOrder对查询进行了重新排序-我看到大量重复项,并为重复项重新确定了新的ID。参见下图。交叉应用导致[Stage]。[BUD_PLN_Spendpln_Dataload_Staging_E_Grouped]表中合同的每个唯一实例的记录,并创建通过笛卡尔积定义的次数-这非常非常糟糕。我试图找到一种通过内部联接执行此操作的方法-但无济于事。

As you see - duplicates names of contracts - crap...see this

这是我的完整查询-需要改进粗体部分,以不仅允许删除重复项,而且还允许ID从174开始并按顺序排列以获取每个唯一的NAME(与Contract-TaskOrder关联)。如果我只是进行分区以包括每个组合的前1个或最大记录,那么根据该序列,我的记录将具有非常稀疏的ACLORDER ID。

    SELECT * FROM
                 (
                 SELECT DISTINCT
                       'READWRITE' AS [ACCESSMODE],
                        3 AS [ACCESSMODEORDER],
                        **coalesce(const.maxs, 0) + row_number() over (
                        order by (select NULL)) AS [ACLORDER]**,
                        0 AS [ACLSFK],
                        'MEMBER' AS [FLAG],
                        4 AS [FLAGORDER],
                       'N' AS [ISUSER],
                        5 AS [ISUSERORDER],
                       ('SPS-Contract-' + Contract_TaskOrder) AS [NAME],
                       0 AS [NAMEORDER],
                       Contract_TaskOrder AS [OBJECTNAME],
                       1 AS [OBJECTNAMEORDER],
                      'SL_DIMENSION' AS [OBJECTTYPE],
                       2 AS [OBJECTTYPEORDER],
                      NULL AS [PARENT],
                      NULL AS [PARENTORDER] 
              FROM
       **[Stage].[BUD_PLN_Spendpln_Dataload_Staging_E_Grouped] cross apply (
            select max(ACLORDER) as maxs 
            from [BFS_ODI_WORK].[Stage].[BUD_PLN_SECURITY_MEMBERS] ) const 
   )**
   M 
WHERE
   1 = 1 
   AND NOT EXISTS 
   (
      SELECT
         1 
      FROM
         [BFS_ODI_WORK].[Stage].[BUD_PLN_SECURITY_MEMBERS] k 
      WHERE
         M.[NAME] = k.[NAME] 
         AND M.[FLAG] = k.[FLAG] 
         AND M.[OBJECTNAME] = k.[OBJECTNAME] 
         AND M.[OBJECTTYPE] = k.[OBJECTTYPE]
   )
order by
   NAME

0 个答案:

没有答案