![](/img/trans.png)
[英]SQL Server 2008 Preserve rows from table with non-matching values from another table
[英]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
每个列都是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 ..
这是我的第一个表的完整结构,其中包含数据。
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.