TSQL选择进入插入多行到第1行,多列的最简单的方法(TSQL select into insert

2019-10-19 06:54发布

我使用MS SQL Server 2008 R2和我有一个成绩表,我想从另一个表属于数据来填充。

// Results table definition

create table resultsTable
(
  RowId int Identity(1,1) Not Null,

  sid1 int, colA1 int, colB1 int, colC1 int,
  sid2 int, colA2 int, colB2 int, colC2 int,
  sid3 int, colA3 int, colB3 int, colC3 int,
  colX  bit      
)

// Source table definition

create table sourceTable
(
  RowId int Identity(1,1) Not Null ,
  colA int , colB int , colC int , colX bit ,
) 

如果源表有超过100行数据,我希望能够选择使用类似3行

select top 3
       colA,
       colB,
       colC,
       colX
from sourceTable
where Rowid >= @RowIdVariable

其中@RowIdVariable值从另一个表的到来,RowsIdFrom

create table RowIdsFromTable
( 
  id int Identity(1,1) Not Null,
  RowIdFrom int
)

我想用光标这一点。

declare MyCursor cursor for
    select RowIdFrom from RowIdsFromTable order by RowIdFrom asc
Open MyCursor 

我知道我的结果会是这个样子下面的select语句

sid | colA | colB | colC | colX
-------------------------
1     1      2      3      0
2     4      5      6      0
3     7      8      9      1 

有了这些结果,我非常想知道我怎么能可能将它们插入到我的resultsTable使

select *
from resultsTable

看起来应该像下面的结果,并做以最有效的方式,请:d

rowId | sid1 | colA1 | colB1 | colC1 | sid2 | colA2 | colB2 | colC2 | sid3 | colA3 | colB3 | colC3 | colX
1       1       1      2       3       2      4       5       6       3      7       8       9       1

其中COLX位值属于最后一行,如在上述例子中,

colA | colB | colC | colX
-------------------------
7      8      9      1 

感谢您的指点和帮助:d

1402 13编辑:

为了提供更多的信息或更清楚,我需要,因为我有一个定义的一切,我应该从选择rowid的另一个表插入到resultsTable返回的行。 此表只包含起点RowId的公司。

因此,该期望的输出可能看起来像下面如果RowIdsFromTable包含3个值,1,12和20

rowId | sid1 | colA1 | colB1 | colC1 | sid2 | colA2 | colB2 | colC2 | sid3 | colA3 | colB3 | colC3 | colX
1       1      1       2       3       2      4       5       6       3      7       8       9       1
2       12     24      9       13      32     13      43      88      14     2       54      23      0
3       20     xx      xx      xx      21     xx      xx      xx      22     xx      xx      xx      1

其中“xx”表示从sourceTable会整数值。 请注意,SID的升序的顺序。

我附上与表和一些测试数据的SQL小提琴: http://sqlfiddle.com/#!3/95fa8/1/0 。

Answer 1:

如果你的目标真的是要选择行有限数量来执行这个脚本,那么你可以使用下面的解决方案。

WITH Top_3_Rows_CTE AS (
SELECT Top 3 1 AS Artificial_Grouping
    ,RowID
    , colA
    , colB
    , colC
    , colX

FROM sourceTable

WHERE RowID >=2
)

, Row_Numbers_CTE AS (
SELECT ROW_NUMBER() OVER (ORDER BY Artificial_Grouping) AS Row_Number --Pick an order by clause that makes the most sense for your situation
    , Artificial_Grouping
    , RowID
    , ColA
    , ColB
    , ColC
    , ColX

FROM Top_3_Rows_CTE
)

SELECT DISTINCT R2.RowID AS RowID1
    , R2.ColA AS ColA1
    , R2.ColB AS ColB1
    , R2.ColC AS ColC1
    , R2.ColX AS ColX1
    , R3.RowID AS RowID2
    , R3.ColA AS ColA2
    , R3.ColB AS ColB2
    , R3.ColC AS ColC2
    , R3.ColX AS ColX2
    , R4.RowID AS RowID3
    , R4.ColA AS ColA3
    , R4.ColB AS ColB3
    , R4.ColC AS ColC3
    , R4.ColX AS ColX3

FROM Row_Numbers_CTE R1
    LEFT OUTER JOIN Row_Numbers_CTE R2
        ON R2.Row_Number = 1
            AND R1.Artificial_Grouping = R2.Artificial_Grouping
    LEFT OUTER JOIN Row_Numbers_CTE R3
        ON R3.Row_Number = 2
            AND R1.Artificial_Grouping = R3.Artificial_Grouping
    LEFT OUTER JOIN Row_Numbers_CTE R4
        ON R4.Row_Number = 3
            AND R1.Artificial_Grouping = R4.Artificial_Grouping --You would create another join here for each row you want broken out into columns

这应该是非常快,因为它开始只能选择3行和所有的处理仅限于含有不超过3行的CTE。 你想补充左外连接到Row_Numbers_CTE您要调换成新的列每增加一行。



Answer 2:

你还没有明确的X位是如何被解决(选择单bit从值3 ),所以我做出了选择(1个胜位,其otherwises 0)。

下面的查询应该做你使用group by 。 我们做到以下几点:

  • 使用row_number()到连续行ID分配给该组
  • 使用模算术3所设定的分割成3行组,该组中的连续序列号码赋予各行:0,1或2。
  • 总结(弄平)每个组成单个行经由group by ,突出原始组内的每个行到摘要列在正确的列。

这里的查询:

select t.gid ,
       A1 = sum( case t.seq when 0 then A else null end ) ,
       B1 = sum( case t.seq when 0 then B else null end ) ,
       C1 = sum( case t.seq when 0 then C else null end ) ,
       A2 = sum( case t.seq when 1 then A else null end ) ,
       B2 = sum( case t.seq when 1 then B else null end ) ,
       C2 = sum( case t.seq when 1 then C else null end ) ,
       A3 = sum( case t.seq when 2 then A else null end ) ,
       B3 = sum( case t.seq when 2 then B else null end ) ,
       C3 = sum( case t.seq when 2 then C else null end ) ,
       X  = convert(bit,sign(sum(convert(int,t.X))))
from ( select * ,
              seq = ( row_number() over (order by id) - 1 ) % 3 ,
              gid = ( row_number() over (order by id) - 1 ) / 3
       from dbo.source_table
     ) t
group by t.gid
order by t.gid


文章来源: TSQL select into insert multiple rows into 1 row, many columns simplest way