Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-将数据移动或更新到另一个表中的第一个空列_Sql_Sql Server - Fatal编程技术网

SQL-将数据移动或更新到另一个表中的第一个空列

SQL-将数据移动或更新到另一个表中的第一个空列,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

我有两个包含以下数据的表,我正在使用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
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