【问题标题】:insert rows into table based on criteria根据条件将行插入表中
【发布时间】:2015-09-27 06:01:43
【问题描述】:

假设我有 5 列,其中包含值“A”或“B”

+------+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 | Col5 |
+------+------+------+------+------+
| A    | A    | B    | A    | B    |
| B    | A    | B    | B    | A    |
+------+------+------+------+------+

我还想将这 5 列分配为具有 1 到 5 的 ID 号

+----+---------+
| ID | Columns |
+----+---------+
|  1 | Col1    |
|  2 | Col2    |
|  3 | Col3    |
|  4 | Col4    |
|  5 | Col5    |
+----+---------+

如果第一行中的 col1、col2、col4 包含“A”,我想做的是在 db 表中插入一个新行,在这种情况下,将插入 3 个新行,每个新行都包含它们各自的 ID号码。

我要插入的表格应该是这样的

 +----+----------+----------+----------+----------+
    | ID | SomeCol0 | SomeCol1 | SomeCol2 | SomeCol3 |
    +----+----------+----------+----------+----------+
    |  1 | x        | x        | x        | x        |
    |  2 | x        | x        | x        | x        |
    |  4 | x        | x        | x        | x        |
    +----+----------+----------+----------+----------+

这是针对 VB.NET 应用程序的。我希望在 TSQL 中解决这个逻辑,但 VB 代码也可以。我真的不知道该怎么做。非常感谢任何帮助。

【问题讨论】:

  • 好的。所以你有 3 个正在使用的表?对吗?
  • 不,上面显示的第二个表中的 ID 列不存在。只有我要插入的第三个表中的 ID 列存在。
  • 好的。我觉得我明白了。您想输入列和输出行,并附加一些额外的数据(即 id)?这称为转置
  • 这里有一个关于转置的问题。也许这会有所帮助。 stackoverflow.com/questions/13372276/…

标签: vb.net tsql insert dataset datarow


【解决方案1】:

假设我们有以下数据:

DECLARE @DataSource TABLE
(
    [Col1] CHAR(1)
   ,[Col2] CHAR(1)
   ,[Col3] CHAR(1)
   ,[Col4] CHAR(1)
   ,[Col5] CHAR(1)
);

INSERT INTO @DataSource ([Col1], [Col2], [Col3], [Col4], [Col5])
VALUES ('A', 'A', 'B', 'A', 'B')  -- this should be inserted
      ,('B', 'A', 'B', 'B', 'B')
      ,('A', 'A', 'A', 'A', 'B')  -- this should be inserted
      ,('B', 'B', 'B', 'A', 'B');

首先,我们需要根据您的条件过滤行:

SELECT *
FROM @DataSource
WHERE [Col1] = 'A' AND [Col2] = 'A' AND [Col4] = 'A';

现在,我们需要UNPIVOT 上面的结果,以便为每一列分配一个ID 值:

SELECT [ID]
      ,[Value]
FROM
(
    SELECT [Col1] AS [1]
          ,[Col2] AS [2]
          ,[Col3] AS [3]
          ,[Col4] AS [4]
          ,[Col5] AS [5]
    FROM @DataSource
    WHERE [Col1] = 'A' AND [Col2] = 'A' AND [Col4] = 'A' 
) DS
UNPIVOT
(
    [Value] FOR [ID] IN ([1], [2], [3], [4], [5])
) UNPVT;

最后,只需使用WHERE 子句来过滤ID

SELECT [ID]
      ,[Value]
FROM
(
    SELECT [Col1] AS [1]
          ,[Col2] AS [2]
          ,[Col3] AS [3]
          ,[Col4] AS [4]
          ,[Col5] AS [5]
    FROM @DataSource
    WHERE [Col1] = 'A' AND [Col2] = 'A' AND [Col4] = 'A' 
) DS
UNPIVOT
(
    [Value] FOR [ID] IN ([1], [2], [3], [4], [5])
) UNPVT
WHERE [ID] IN (1, 2, 4);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    相关资源
    最近更新 更多