【问题标题】:T-SQL CROSS APPLY INTO THE SAME TABLET-SQL 交叉应用到同一张表中
【发布时间】:2017-04-26 09:42:50
【问题描述】:

我有一张桌子:

Col1  Col2  Col3
----  ----  ----
 A     AA    dfdf
 A     BB    jhf
 A     CC    lkji
 B     AA    jkl
 B     CC    ioeu
 B     DD    sjdf
 C     AA    zkjjj

我想要的是找到完整的 Col2 集合,然后为每个 Col1 再次将其添加到表中,将所有其他字段保留为 NULL/空白。

我有一个使用 4 个表的解决方案(Col1 的不同表,Col2 的不同表,然后 CROSS APPLY 到表 3,最后将所有丢失的记录插入到我的原始源表中),但我觉得我可以没有他们就这样做,如果我想出来的话。这就是我卡住的地方。

所以在上面的例子中,我最终会得到

Col1  Col2  Col3
----  ----  ----
 A     AA    dfdf
 A     BB    jhf
 A     CC    lkji
 A     DD    
 B     AA    jkl
 B     BB
 B     CC    ioeu
 B     DD    sjdf
 C     AA    zkjjj
 C     BB   
 C     CC   
 C     DD 

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    您描述的方法(您的“4 个表”)很好,但您可以通过使用CTEs 而不是表来使用 ad-hoc sql。试试这样:

    DECLARE @tbl TABLE(Col1 VARCHAR(10),Col2 VARCHAR(10),Col3 VARCHAR(10));
    INSERT INTO @tbl VALUES
     ('A','AA','dfdf')
    ,('A','BB','jhf')
    ,('A','CC','lkji')
    ,('B','AA','jkl')
    ,('B','CC','ioeu')
    ,('B','DD','sjdf')
    ,('C','AA','zkjjj');
    
    WITH Distinct1 AS(SELECT DISTINCT Col1 FROM @tbl)
        ,Distinct2 AS(SELECT DISTINCT Col2 FROM @tbl)
    INSERT INTO @tbl(Col1,Col2,Col3)
    SELECT d1.Col1,d2.Col2,NULL
    FROM Distinct1 AS d1
    CROSS APPLY Distinct2 AS d2
    WHERE NOT EXISTS(SELECT 1 FROM @tbl WHERE Col1=d1.Col1 AND Col2=d2.Col2);
    
    SELECT * FROM @tbl
    ORDER BY Col1,Col2
    

    提示:当一个表必须包含所有可能的子集组合时,这可能是一个糟糕设计的指标......

    【讨论】:

    • 谢谢你!这正是我试图写的。如果您好奇,请了解一些背景知识,我们托管了大约 60 个数据库,并且它们有“补丁历史”表。我们使用 Excel 从创建数据库名称和补丁的 SP 中获取列表。我被要求提供“数据库和缺失补丁的列表”。这种方法避免了需要包含最新补丁列表(永远不会更新)的表(或 Excel 中的列表)。相反 - 通过在一台服务器上粘贴补丁,Excel 中的其余部分将显示为缺少该补丁。这是一个为期两天的小项目。再次感谢!
    • @SarahC 啊,我明白了...快乐编码!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2011-11-27
    相关资源
    最近更新 更多