【问题标题】:Select into #TempTable from @Variable results to Cartesian Product从@Variable 结果选择到#TempTable 到笛卡尔积
【发布时间】:2016-04-01 04:39:01
【问题描述】:

将表变量插入到具有多列(ID、编号等)的 TempTable 中

其中一个表变量是:

DECLARE @@gvTempTable TABLE (Number bigint, ID int) 

insert into  @@gvTempTable (Number) values ('21212321332332');
insert into  @@gvTempTable (Number) values ('100000000000');
insert into  @@gvTempTable (ID) values ('1');
insert into  @@gvTempTable (ID) values ('12');

select * into ##GlobalTempTable from @@gvTempTable;
select * from ##GlobalTempTable;

我需要将 ID 和 Number 显示为没有 NULL 的一行

这会返回一种笛卡尔积:

[![Current vs Desired result set][1]][1]

【问题讨论】:

  • values ('21212321332332', 1), ('100000000000', 12)
  • 你需要详细描述一下,这里的逻辑是什么
  • 这适用于少量记录。但没有大一号。我收到此消息:Msg 10738, Level 15, State 1, Line 1006 INSERT 语句中的行值表达式的数量超过了允许的最大行值数 1000。
  • 要绕过它,我需要每千行重复一次 Insert Into @@gvTempTable(...)。

标签: sql sql-server global-variables global-temp-tables


【解决方案1】:

这会给你想要的结果

select  Number = min(Number), ID = min(ID)
into    ##GlobalTempTable
from
(
    select *, rn = row_number() over (partition by case when Number IS NULL then 1 else 2 end order by ID) 
    from    @@gvTempTable
) d
group by rn

【讨论】:

    猜你喜欢
    • 2017-12-14
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多