将CTE结果插入临时表会生成重复的行

时间:2017-08-05 01:25:09

标签: sql sql-server common-table-expression

我有一系列的CTE,我想在最后将结果插入临时表中。但是,我最终得到16行重复数据,而不仅仅是一行。这是我的代码:

INSERT INTO #lvl_1_results
    (
        [Level_1]                       
      , [Level_0]                       
      , [P]
      , [Sim (%)]
      , [V]
      , [StAV (%)]
      , [CV]
      , [CV (%)]
      , [Sim (Mean)]
      , [SD]
      , [IAV]
      , [MAV]
      , [BMP]
      , [BMP (%)]
      , [BMV]
      , [BMV (%)]
      , [BMCV]
      , [BMCV (%)]
      , [Sim BMP (Mean)]
      , [BM SD]
      , [SAP]
      , [SAP (%)]
      , [ActV]
      , [ActV (%)]
      , [ACV]
      , [ACV (%)]
      , [Act (Mean)]
      , [Act SD]
      , [MV]
      , [MV (%)]
    )
        SELECT sc.[Level_1]
             , sc.[Level_0]
             , [P]
             , [P] / NULLIF([MV], 0)
             , [V]
             , [V] / NULLIF([MV], 0)
             , [CV]
             , [CV] / NULLIF([upper VaR], 0)
             , [Sim (Mean)]
             , [SD]
             , [IAV]
             , [MAV]
             , [BMP]
             , [BMP] / NULLIF([MV], 0)
             , [BMV]
             , [BMV] / NULLIF([MV], 0)
             , [BMCV]
             , [BMCV] / NULLIF([upper bm VaR], 0)
             , [Sim BMP (Mean)]
             , [BM SD]
             , [SAP]
             , [SAP] / NULLIF([MV], 0)
             , [ActV]
             , [ActV] / NULLIF([MV], 0)
             , [ACV]
             , [ACV] / NULLIF([upper active VaR], 0)
             , [Act (Mean)]
             , [Act SD]
             , [MV]
             , [MV] / NULLIF([parent_MV], 0)
        FROM sc
           , s_p
           , s_v
           , bm_c
           , bm_v
           , bm_p
           , a_c
           , a_v
           , a_p
           , MV
           , upper_mv
           , c_l_v
           , bm_c_l_v
           , a_c_l_v
           , s_m
           , bm_m
           , a_m
           , sim_sd
           , bm_sd
           , a_sd
           , s_i
           , s_mar

如何让这个查询只生成一行?出于性能原因,我认为我应该选择一种不仅选择不同行的解决方案。

1 个答案:

答案 0 :(得分:0)

正如其他人在评论中指出的那样,此查询不使用ansi JOIN语法:

TableA
[INNER/LEFT] JOIN
TableB
ON
 TableA.id=tableb.id

使用这种风格的好处是你必须提供一个ON子句,它强迫你思考你的表中的数据是如何实际相关的

你还没有告诉数据库这些数据是如何相关的,所以它所做的只是将它找到的每一行连接到每一行,给出每一个可能的行组合

因为您获得了16行,这意味着您的某些表有2行或更多行。如果2个表有2行,则结果为2x2x2x2行。 (或者也许两个表有2行,一个有4个,或者两个表有4行..或者2和8,无论哪种方式,当乘以每行连接到每一行时,你得到16行)

如果您有2个表格具有值a,b和1,2并且它们像您在此处所做的那样加入,则数据库将为您提供

a,1
a,2
b,1
b,2

这些行本身都是独一无二的,但如果您刚刚选择了这封信,则会看到a b b,然后抱怨重复的字母。如果您只是查看数字,投诉将是相同的

添加更多表格,它们之间没有任何关系,它会变得更糟。希望很容易看到用x和y添加另一个2行表会将结果增加到8行..

您必须告诉您的数据库哪些表将表链接在一起。如果要查看哪些表格导致重复,请执行选择*