SQL-将数据移动或更新到另一个表中的第一个空列
我有两个包含以下数据的表,我正在使用Microsoft SQL Express管理它们: 表1SQL-将数据移动或更新到另一个表中的第一个空列,sql,sql-server,Sql,Sql Server,我有两个包含以下数据的表,我正在使用Microsoft SQL Express管理它们: 表1 Name Col1 ColSwitch Row1 3 NULL Row2 7 NULL Row3 5 True Row4 12 True Row5 2 True 表2 Name Col1 Col2 Col3 Row3 3 NULL NULL Row4 4 10 NULL Row6 2 3 9 Ro
Name Col1 ColSwitch
Row1 3 NULL
Row2 7 NULL
Row3 5 True
Row4 12 True
Row5 2 True
表2
Name Col1 Col2 Col3
Row3 3 NULL NULL
Row4 4 10 NULL
Row6 2 3 9
Row7 6 NULL NULL
当ColSwitch设置为True时,我希望将行从表1移动到表2。 我可以通过以下方法成功地做到这一点:
INSERT Table2 (Name, ColN)
SELECT Name, Col1
FROM Table1
WHERE ColSwitch LIKE 'True'
但当我更新现有条目(示例中的第3行和第4行)时需要选择第一个空列时,我的问题就出现了。
我发现了一个使用PHP的示例,但我希望在此时避免使用PHP
只需使用提供的方法而不使用PHP,就会用空列名填充第一列。(下文)
期望的输出是,表2中的第一个空字段被表1中的值替换,或者,如果所有字段都已填充,则添加到Col3 假设顶部原始表格中的行3=5、行4=12和行5=2,则输出
Name Col1 Col2 Col3
Row3 3 5 NULL
Row4 4 10 12
Row5 2 NULL NULL
Row6 2 3 9
Row7 6 NULL NULL
仅使用简单的SQL就可以做到这一点吗?如果是的话,请解释如何最好地接近这一点,如果可能的话,提供一个例子:( < p>你的设计导致复杂的情况,考虑重新设计你的解决方案。 因为你没有描述你整个问题的细节,我在这里帮不上忙 解决方案1:
生成动态SQL并执行它。因为列是动态的,所以每行必须生成一个INSERT
SELECT @query='construct insert command text here' FROM Table2,Table1
EXEC sp_executesql @query
解决方案2:
如果列集有限,则可以使用“合并”命令。
你应该增加你的条件
MERGE INTO Table2
USING Table1
ON Table1.Name=Table2.Name
WHEN MATCHED AND Table2.Col1 IS NULL
THEN UPDATE SET Col1=Table1.Col1
WHEN MATCHED AND Table2.Col2 IS NULL
THEN UPDATE SET Col2=Table1.Col1
WHEN NOT MATCHED BY SOURCE
THEN INSERT (Name,Col1) VALUES Table1.Name, Table1.Col1
显示您输入的所需输出允许您在单个查询中进行插入和更新。是否所有列都以第一个NULL开头为NULL?或者第3列中是否有空值,第4列中是否有值?只有3列,在某些情况下第1列也可以为空,但它通常不属于此查询的一部分。输出将简单地用表1中的Col1值替换第一个NULL(或者,如果所有列都已填充,则添加到Col3;总共只有3列),我也不清楚,但是是的,Jakub,默认情况下,除Name以外的所有列都为NULL,除非由value替换。所有列也应按顺序填充,因此如果Col2在表2中有值,Col1不应为NULL。多亏了Patrik,目前这是我的整体解决方案,它还没有与任何其他解决方案相关联,所以我遇到的唯一问题是创建SQL查询以将数据从表1移动到表2。我只是在这里开始我的数据库项目,所以我愿意寻找更好的数据库设计替代方案。当然,最好能够使用当前的设计。我正在查看解决方案2,但对我来说,这似乎需要我在执行此解决方案之前筛选列表,以仅显示ColSwitch=True,我错了吗?之前不需要筛选。将您的条件添加到ON子句中,同时排除您不想在不匹配的子句中插入的reows。不幸的是,这不起作用:“类型为'WHEN MATCHED'的操作不能在合并语句的'UPDATE'子句中出现多次。”我尝试搜索插入或插入WHEN THEN ELSE的方法,但它似乎不适用于我的情况。当匹配且Table2.Col1为空时,则更新集Col1=Table1.Col1当匹配且Table2.Col2为空时,则更新集Col2=Table1.Col1-如果阅读我附加的错误消息,则会导致错误。你只能有一个。我会考虑你的解决方案1作为答案。我将重新设计表,以允许更好的实现,直到有人提供更好的逻辑。
MERGE INTO Table2
USING Table1
ON Table1.Name=Table2.Name
WHEN MATCHED AND Table2.Col1 IS NULL
THEN UPDATE SET Col1=Table1.Col1
WHEN MATCHED AND Table2.Col2 IS NULL
THEN UPDATE SET Col2=Table1.Col1
WHEN NOT MATCHED BY SOURCE
THEN INSERT (Name,Col1) VALUES Table1.Name, Table1.Col1