使用SQL Server 2008中另一个表中的行填充列

使用SQL Server 2008中另一个表中的行填充列,sql,sql-server,Sql,Sql Server,我试图在一个表中的一列下逐个填充另一个表中的行。这意味着必须将特定行中的每个数据背靠背地添加到另一个表中的该列中,然后像这样添加下一行,以此类推 我尝试了每一种方法,到处搜索,但显然有一种方法以前需要做类似的事情 首先,我尝试使用pivot将这些行转换为列,然后尝试导入,但再次失败。有什么合适的方法可以做到这一点吗 我所知道的是,这不是一个简单的问题 insert into tablename (columnname) select *.... 我想是吧 这是我需要从中获取值的数据表

我试图在一个表中的一列下逐个填充另一个表中的行。这意味着必须将特定行中的每个数据背靠背地添加到另一个表中的该列中,然后像这样添加下一行,以此类推

我尝试了每一种方法,到处搜索,但显然有一种方法以前需要做类似的事情

首先,我尝试使用pivot将这些行转换为列,然后尝试导入,但再次失败。有什么合适的方法可以做到这一点吗

我所知道的是,这不是一个简单的问题

insert into tablename (columnname) 
    select *....
我想是吧

这是我需要从中获取值的数据表的示例。每行中的每个单元格都必须背对背

Defter No   Mezarlık    Sayfa No    Satır No    
--------------------------------------------
20-8        ÇAMLICA            1    1       
20-8        ÇAMLICA            1    2   
然后在该表的值列下插入

TipId   EvrakId IndexId Value   KayitTarihi
--------------------------------------------
1         23      66     JohnMc   NULL
2         45      32     NewYork  NULL
每列都是nvarchar,Value列也是。所以我希望这张桌子是这样的

TipId   EvrakId IndexId Value   KayitTarihi
--------------------------------------------
1         23      66     JohnMc   NULL
2         45      32     NewYork  NULL
..        ..     ..      20-8     ..
..        ..     ..      ÇAMLICA  ..    
..        ..     ..      1        .. 
..        ..     ..      1        .. 
..        ..     ..      20-8     ..
..        ..     ..      ÇAMLICA  ..    
..        ..     ..      1        .. 
..        ..     ..      2        .. 
TipID   EvrakID IndexID Value       KayitTarihi
1       23      66      JohnMc      NULL
NULL    23      67      20-8        NULL
NULL    23      68      ÇAMLICA     NULL
NULL    23      69      1           NULL
NULL    23      70      1           NULL
2       45      66      NewYork     NULL
NULL    45      67      20-8        NULL
NULL    45      68      ÇAMLICA     NULL
NULL    45      69      1           NULL
NULL    45      70      2           NULL
3       46      66      NewYork     NULL
NULL    46      67      20-8        NULL
NULL    46      68      NULL TEST   NULL
NULL    46      69      NULL        NULL
NULL    46      70      NULL        NULL
这是我的第一个表的完整结构,其中包含数据

CREATE TABLE [dbo].[EvrakUstBilgileri](
[Evrak Id] [float] NULL,
[Defter No] [nvarchar](255) NULL,
[Mezarlık] [nvarchar](255) NULL,
[Sayfa No] [nvarchar](255) NULL,
[Satır No] [nvarchar](255) NULL,
[Ada No] [nvarchar](255) NULL,
[Mezar No] [nvarchar](255) NULL,
[Adı Soyadı] [nvarchar](255) NULL,
[Doğduğu Gün] [nvarchar](255) NULL,
[Yaş] [nvarchar](255) NULL,
[Cinsiyet] [nvarchar](255) NULL,
[Öldüğü Gün] [nvarchar](255) NULL,
[Gömüldüğü Gün] [nvarchar](255) NULL,
[Defin Ruhsatiye No] [nvarchar](255) NULL,
[Defin Ruhsatiye Tarihi] [nvarchar](255) NULL,
[Defin Ruhsatiye Verildiği Yer] [nvarchar](255) NULL,
[Eşleştirme Yapıldı] [nvarchar](255) NULL,
[Evrak Barkodu] [nvarchar](255) NULL,
[Okunamadı] [nvarchar](255) NULL,
[Not] [nvarchar](255) NULL,
[Belge Tarihi] [nvarchar](255) NULL
) ON [PRIMARY]
这是我需要填充的第二个表

CREATE TABLE [dbo].[TblEvrakTipValue](
[TipId] [int] NOT NULL,
[EvrakId] [int] NOT NULL,
[IndexId] [int] NOT NULL,
[Value] [nvarchar](250) NULL,
[KayitTarihi] [datetime] NULL
) ON [PRIMARY]
这两个表都具有相同的EvrakId列,该列的作用应与主键相同

这是已经有数据的表1

EvrakId DefterNo    Mezarlik    SayfaNo SatirNo
5018352 20-8        ÇAMLICA     1       1
5018353 20-8        ÇAMLICA     1       2
5018354 20-8        ÇAMLICA     1       3
5018355 20-8        ÇAMLICA     1       4
5018356 20-8        ÇAMLICA     1       5
IndexId结构应该是这样的

TipId   EvrakId IndexId Value   KayitTarihi
--------------------------------------------
1         23      66     JohnMc   NULL
2         45      32     NewYork  NULL
..        ..     ..      20-8     ..
..        ..     ..      ÇAMLICA  ..    
..        ..     ..      1        .. 
..        ..     ..      1        .. 
..        ..     ..      20-8     ..
..        ..     ..      ÇAMLICA  ..    
..        ..     ..      1        .. 
..        ..     ..      2        .. 
TipID   EvrakID IndexID Value       KayitTarihi
1       23      66      JohnMc      NULL
NULL    23      67      20-8        NULL
NULL    23      68      ÇAMLICA     NULL
NULL    23      69      1           NULL
NULL    23      70      1           NULL
2       45      66      NewYork     NULL
NULL    45      67      20-8        NULL
NULL    45      68      ÇAMLICA     NULL
NULL    45      69      1           NULL
NULL    45      70      2           NULL
3       46      66      NewYork     NULL
NULL    46      67      20-8        NULL
NULL    46      68      NULL TEST   NULL
NULL    46      69      NULL        NULL
NULL    46      70      NULL        NULL
第一个真实的20指数数据

TipId   EvrakId IndexId Value   KayitTarihi
14         1    388      NULL   NULL
14         2    336      NULL   NULL
14         3    408      NULL   NULL
14         4    83       NULL   NULL
14         5    402      NULL   NULL
14         6    403      NULL   NULL
14         7    404      NULL   NULL
14         8    228      NULL   NULL
14         9    390      NULL   NULL
14         10   419      NULL   NULL
14         11   406      NULL   NULL
14         12   392      NULL   NULL
14         13   389      NULL   NULL
14         14   401      NULL   NULL
14         15   362      NULL   NULL
14         16   407      NULL   NULL
14         17   391      NULL   NULL
14         18   400      NULL   NULL
14         19   242      NULL   NULL
14         20   92       NULL   NULL

谢谢你的帮助。

这里有一个以臭名昭著的unpivot为特色的例子:-p。按照你的建议,我暂时取消了所有其他列

DECLARE @t1 TABLE(
  EvrakID NVARCHAR(100),
  DefterNo NVARCHAR(100),
  Mezarlik NVARCHAR(100),
  SayfaNo NVARCHAR(100),
  SatirNo NVARCHAR(100)
)

INSERT INTO @t1 VALUES
('23', '20-8'        ,'ÇAMLICA',            '1'    ,'1')       
,('45', '20-8'        ,'ÇAMLICA',            '1'    ,'2')  
,('46', '20-8'        ,'NULL TEST',            NULL    ,NULL)  


DECLARE @t2 TABLE(
  TipID NVARCHAR(100),
  EvrakID NVARCHAR(100),
  IndexID NVARCHAR(100),
  Value NVARCHAR(100),
  KayitTarihi NVARCHAR(100)
)

INSERT INTO @t2 VALUES
('1'         ,'23'      ,'66'    ,'JohnMc',   NULL)
,('2'         ,'45'      ,'32'    ,'NewYork',  NULL)
,('3'         ,'46'      ,'32'    ,'NewYork',  NULL)

DECLARE @MaxIndexID INT = (SELECT MAX(IndexId) FROM @t2);

WITH cte AS(
  SELECT  t1.EvrakID,
          ISNULL(t1.DefterNo,'*NULL#') DefterNo,
          ISNULL(t1.Mezarlik,'*NULL#') Mezarlik,
          ISNULL(t1.SayfaNo,'*NULL#') SayfaNo,
          ISNULL(t1.SatirNo, '*NULL#') SatirNo
    FROM @t1 t1
),
cteColsToRows AS(
  SELECT EvrakID, ROW_NUMBER() OVER (PARTITION BY EvrakID ORDER BY (SELECT 0)) rn, NewRow
    FROM
    (SELECT   EvrakID,
              DefterNo,
              Mezarlik,
              SayfaNo,
              SatirNo
       FROM cte) AS nr
       UNPIVOT
       (NewRow FOR OldCols IN (DefterNo, Mezarlik, SayfaNo, SatirNo)
       ) AS NewRows
)
INSERT INTO @t2
SELECT  NULL TipID,
        EvrakID,
        @MaxIndexID + rn AS IndexId,
        CASE WHEN NewRow = '*NULL#' THEN NULL ELSE NewRow END AS Value,
        NULL KayitTarihi
  FROM cteColsToRows

SELECT *
  FROM @t2
  ORDER BY EvrakID, ISNULL(TipID, 999999)
结果:

TipID   EvrakID IndexID Value       KayitTarihi
1       23      66      JohnMc      NULL
NULL    23      67      20-8        NULL
NULL    23      68      ÇAMLICA     NULL
NULL    23      69      1           NULL
NULL    23      70      1           NULL
2       45      32      NewYork     NULL
NULL    45      67      20-8        NULL
NULL    45      68      ÇAMLICA     NULL
NULL    45      69      1           NULL
NULL    45      70      2           NULL
3       46      32      NewYork     NULL
NULL    46      67      20-8        NULL
NULL    46      68      NULL TEST   NULL
NULL    46      69      NULL        NULL
NULL    46      70      NULL        NULL
TipID   EvrakID IndexID Value       KayitTarihi
1       23      66      JohnMc      NULL
NULL    23      388     20-8        NULL
NULL    23      336     ÇAMLICA     NULL
NULL    23      408     1           NULL
NULL    23      83      1           NULL
2       45      32      NewYork     NULL
NULL    45      388     20-8        NULL
NULL    45      336     ÇAMLICA     NULL
NULL    45      408     1           NULL
NULL    45      83      2           NULL
3       46      32      NewYork     NULL
NULL    46      388     20-8        NULL
NULL    46      336     NULL TEST   NULL
NULL    46      408     NULL        NULL
NULL    46      83      NULL        NULL

这应该是表2的最终状态。正如您所看到的,一些预定义的、已知的IndexId值只是为每个新的EvrakId重复它们自己。当然,此示例仅适用于4列。在我的第一个表中有20列,因此有20个不同的IndexId,但一旦你给我正确的算法查询,我将能够像以前一样再次编辑所有20列。另外,由于这两个示例列不是真实数据,因此此处不提供它们。

在该解决方案中,我添加了表变量@tColIndexID,它保存当前四个新值的给定索引。然后将这些索引添加到每一新行:

DECLARE @t1 TABLE(
  EvrakID NVARCHAR(100),
  DefterNo NVARCHAR(100),
  Mezarlik NVARCHAR(100),
  SayfaNo NVARCHAR(100),
  SatirNo NVARCHAR(100)
)

INSERT INTO @t1 VALUES
('23', '20-8'        ,'ÇAMLICA',            '1'    ,'1')       
,('45', '20-8'        ,'ÇAMLICA',            '1'    ,'2')  
,('46', '20-8'        ,'NULL TEST',            NULL    ,NULL)  


DECLARE @t2 TABLE(
  TipID NVARCHAR(100),
  EvrakID NVARCHAR(100),
  IndexID NVARCHAR(100),
  Value NVARCHAR(100),
  KayitTarihi NVARCHAR(100)
)

INSERT INTO @t2 VALUES
('1'         ,'23'      ,'66'    ,'JohnMc',   NULL)
,('2'         ,'45'      ,'32'    ,'NewYork',  NULL)
,('3'         ,'46'      ,'32'    ,'NewYork',  NULL)

DECLARE @tColIndexID TABLE(
  ColID INT
 ,IndexID INT
)

INSERT INTO @tColIndexID
  VALUES (1, 388)
        ,(2, 336)
        ,(3, 408)
        ,(4, 83);

WITH cte AS(
  SELECT  t1.EvrakID,
          ISNULL(t1.DefterNo,'*NULL#') DefterNo,
          ISNULL(t1.Mezarlik,'*NULL#') Mezarlik,
          ISNULL(t1.SayfaNo,'*NULL#') SayfaNo,
          ISNULL(t1.SatirNo, '*NULL#') SatirNo
    FROM @t1 t1
),
cteColsToRows AS(
  SELECT EvrakID, ROW_NUMBER() OVER (PARTITION BY EvrakID ORDER BY (SELECT 0)) rn, NewRow
    FROM
    (SELECT   EvrakID,
              DefterNo,
              Mezarlik,
              SayfaNo,
              SatirNo
       FROM cte) AS nr
       UNPIVOT
       (NewRow FOR OldCols IN (DefterNo, Mezarlik, SayfaNo, SatirNo)
       ) AS NewRows
)
INSERT INTO @t2
SELECT  NULL TipID,
        EvrakID,
        t3.IndexID AS IndexId,
        CASE WHEN NewRow = '*NULL#' THEN NULL ELSE NewRow END AS Value,
        NULL KayitTarihi
  FROM cteColsToRows
  JOIN @tColIndexID t3 ON t3.ColID = rn

SELECT *
  FROM @t2
  ORDER BY EvrakID, ISNULL(TipID, 999999)
结果:

TipID   EvrakID IndexID Value       KayitTarihi
1       23      66      JohnMc      NULL
NULL    23      67      20-8        NULL
NULL    23      68      ÇAMLICA     NULL
NULL    23      69      1           NULL
NULL    23      70      1           NULL
2       45      32      NewYork     NULL
NULL    45      67      20-8        NULL
NULL    45      68      ÇAMLICA     NULL
NULL    45      69      1           NULL
NULL    45      70      2           NULL
3       46      32      NewYork     NULL
NULL    46      67      20-8        NULL
NULL    46      68      NULL TEST   NULL
NULL    46      69      NULL        NULL
NULL    46      70      NULL        NULL
TipID   EvrakID IndexID Value       KayitTarihi
1       23      66      JohnMc      NULL
NULL    23      388     20-8        NULL
NULL    23      336     ÇAMLICA     NULL
NULL    23      408     1           NULL
NULL    23      83      1           NULL
2       45      32      NewYork     NULL
NULL    45      388     20-8        NULL
NULL    45      336     ÇAMLICA     NULL
NULL    45      408     1           NULL
NULL    45      83      2           NULL
3       46      32      NewYork     NULL
NULL    46      388     20-8        NULL
NULL    46      336     NULL TEST   NULL
NULL    46      408     NULL        NULL
NULL    46      83      NULL        NULL

编辑你的问题,提供样本数据和期望的结果。哦,是的,我的错。我不习惯在这里以恰当的方式提问。我遗漏了什么吗?我没有看到您的第二个表中的任何数据存在于第一个表中。。。在你的例子中:你从最上面的桌子上拿了什么?你把它放在第二张桌子上的什么地方?这是因为这两张桌子通常互不相关。我只需要用第一个表中的行填充第二个表中的值列,仅此而已。我上一次的编辑应该会让我更清楚我想要什么。在你上一次的编辑中:你对每行TipID的期望是什么?e、 g.第一次20-8或第一次圣母玛利亚?乍一看,就像某种交叉连接……是的,这是我们真正的交易:……完全按照预期工作,再次感谢,希望是最后一次;很高兴我能帮忙如果您也能给我一个向上投票的机会,那就太好了:我甚至不知道从xD到哪里去做……如果您说的是接受答案图标上方的上下箭头,那么我不能,因为这需要我至少有15次代表才能做到:正是这些。:-没问题-也许当你达到这个声誉时,你会记得这条线索-别担心,我已经把这个书签了;。。。为了让你的解决方案在我的翅膀下,为了在某个时候给你带来声誉:P.但特别是我必须阅读并理解这个问题中到底发生了什么…当我使用其他ppl的解决方案而不知道它们在做什么时,我恨我自己: