我有一系列的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
如何让这个查询只生成一行?出于性能原因,我认为我应该选择一种不仅选择不同行的解决方案。
答案 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行..
您必须告诉您的数据库哪些表将表链接在一起。如果要查看哪些表格导致重复,请执行选择*