使用多列插入表格

时间:2018-10-09 11:47:01

标签: sql sql-server insert

假设我们有一个看起来像这样的表:

enter image description here

Comma1列是一个personID值,而comma2comma3comma4等(此表是动态创建的,因此可以超过4列)是teamID

现在,我还有另一个名为personTeam的表,该表保持personidsteamids之间的关系。例如,如果某人13是团队3和团队8的成员,那么在personTeam表中应该有2条记录(13,3和13,8)。

我需要的是,使用附图中的此表,将personidsteams插入到PersonTeam表中。例如对于人149我想要插入(149,10)但对于人221我想要(221,7),(221,8),(221,11)。

有什么办法可以解决此问题? 谢谢

4 个答案:

答案 0 :(得分:0)

您正在 SELECT 语句中寻找 UNPIVOT 子句。

测试数据

declare @t1 as table (
    comma1 int,
    comma2 int,
    comma3 int,
    comma4 int 
)

insert into @t1 values
     (149,10,null,null)
    ,(221, 7,8,11)
    ,(278,3,10,null);

select * from @t1;

解决方案示例

select comma1 as personid , value1
into #TmpTeam
from @t1 unpivot ( value1 for Team in ( comma2,comma3,comma4)) as p;

select * from #TmpTeam;

您可以使用其他语法将查询结果插入表中。这只是一个例子。

答案 1 :(得分:0)

实现这一目标的一种方法是使用<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/clContainer" android:layout_height="match_parent" tools:context="com.guna.kotlinapplication.BlankFragment"> <com.guna.kotlinapplication.DraggableTextView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="183dp" android:layout_marginStart="56dp" android:paddingStart="5dp" android:paddingLeft="5dp" android:text="@string/app_name" android:paddingEnd="5dp" android:tag="@string/app_name" android:textSize="22sp" android:paddingRight="5dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" android:src="@drawable/ic_launcher_background" /> </android.support.constraint.ConstraintLayout> UNION

例如:

UNION ALL

insert into personTeam (personid, teamid) select comma1 as personid, comma2 as teamid from commastable where comma2 is not null union select comma1, comma3 from commastable where comma3 is not null union select comma1, comma4 from commastable where comma4 is not null; 仅返回唯一记录,但为此必须对结果进行排序。这会使它比UNION稍慢一些,UNION ALL只会将联合查询的结果粘贴在一起。
我希望源数据不会包含重复项,因此UNION仅用于确保它仅插入唯一的元组。

如果您想使其可重复使用?
只需将该查询放入子查询中,然后将其加入personTeam即可。

insert into personTeam (personid, teamid)
select q.personid, q.teamid
from
(
  -- add the query with the unions here
) as q
left join personTeam as t 
  on (t.personid = q.personid and t.teamid = q.teamid)
where t.personid is null;

答案 2 :(得分:0)

如果我一次性完成此操作,则只需执行三个插入操作即可。
INSERT INTO personTeam (personids, teamids) SELECT comma1, comma2 from table


INSERT INTO personTeam (personids, teamids) SELECT comma1, comma3 from table WHERE comma2 is null


INSERT INTO personTeam (personids, teamids) SELECT comma1, comma4 from table WHERE comma2 is null and comma3 is null

unpivot命令用于将数据规范化到表。仅适用于2005 +

insert into personteam (personids, teamids) select comma1, teamids from input unpivot ( teamids for teams in (comma2, comma3, comma4) ) as u;

答案 3 :(得分:0)

要使其可以使用任意数量的列,您可以构建一个动态查询并执行它。

DECLARE @dynSql VARCHAR(max)
DECLARE @table_name VARCHAR(max) = 'tbl'

SELECT @dynSql = (
  SELECT 
     'INSERT INTO personTeam SELECT comma1, ' + 
      COLUMN_NAME + 
     ' FROM ' + 
     @table_name + 
     ' WHERE ' + 
     COLUMN_NAME + 
     ' IS NOT NULL; '
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = @table_name
  AND ORDINAL_POSITION != 1
  FOR XML PATH('')
)

EXECUTE(@dynSql);

SELECT * FROM personTeam

只需将@table_name变量设置为输入表的名称。

这是建立一个像这样的字符串

INSERT INTO personTeam SELECT comma1, comma2 FROM tbl WHERE comma2 IS NOT NULL;

输入表中的每一列(第一列除外;即comma2,comma3等),然后执行该语句。

http://sqlfiddle.com/#!18/53fcd/24