假设我们有一个看起来像这样的表:
Comma1
列是一个personID值,而comma2
,comma3
,comma4
等(此表是动态创建的,因此可以超过4列)是teamID
现在,我还有另一个名为personTeam
的表,该表保持personids
和teamids
之间的关系。例如,如果某人13是团队3和团队8的成员,那么在personTeam
表中应该有2条记录(13,3和13,8)。
我需要的是,使用附图中的此表,将personids
和teams
插入到PersonTeam
表中。例如对于人149我想要插入(149,10)但对于人221我想要(221,7),(221,8),(221,11)。
有什么办法可以解决此问题? 谢谢
答案 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等),然后执行该语句。