簡體   English   中英

用來自SQL Server 2008中另一個表的行填充列

[英]Populating a column with rows from another table in SQL Server 2008

我正在嘗試一張桌子的一列下依次填充另一張表中的行。 這意味着必須將特定行中的每個數據背對背添加到另一張表的該列中,然后像這樣添加下一行。

我嘗試了每種方法,到處搜索,但顯然以前曾經有人需要做過這樣的事情。

首先,我嘗試將這些行轉換為帶有數據透視表的列,然后嘗試導入,但再次失敗。 有什么適當的方法嗎?

我所知道的是,這不會簡單地完成

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

每個列都是nvarcharValue列也是。 所以我希望這張桌子像這樣;

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        .. 

這是我的第一個表的完整結構,其中包含數據。

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
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

IndexId的前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
NULL    1811417 388     41-2    NULL
NULL    1811417 336     NULL    NULL
NULL    1811417 408     9       NULL
NULL    1811417 83      11      NULL
NULL    1811425 388     41-2    NULL
NULL    1811425 336     NULL    NULL
NULL    1811425 408     9       NULL
NULL    1811425 83      12      NULL
NULL    1811446 388     41-2    NULL
NULL    1811446 336     NULL    NULL
NULL    1811446 408     11      NULL
NULL    1811446 83      1       NULL

這應該是表2的最終狀態。您可以看到一些預定義的,已經知道的IndexId值僅對每個新EvrakId重復。 當然,此示例僅適用於4列。 我的第一個表中有20列,因此有20個不同的IndexId,但是一旦您給我正確的算法(查詢),我就可以像以前一樣為所有20列再次進行編輯。 同樣,這兩個示例列也不在此處,因為它們不是真實數據。

在此解決方案中,我添加了表變量@tColIndexID,該變量保存(當前)四個新值的給定IndexID。 然后將這些IndexID添加到每個新行:

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      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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM