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