如何拆分SQL Server表行中的数据
我有一个事务表,其中包含一列如何拆分SQL Server表行中的数据,sql,.net,sql-server,tsql,Sql,.net,Sql Server,Tsql,我有一个事务表,其中包含一列transactionId,该列的值类似于|H000021 | B1 | 我需要与表Category进行联接,该表有一列CategoryID,其值类似于H000021 除非数据相同,否则无法应用联接 因此,我想分割或删除TransctionId中包含的不必要数据,以便可以连接这两个表 请帮助我解决问题。您应该修复数据,使列相同。但有时我们会被其他人糟糕的设计决策所困扰。特别是,事务数据应该包含类别的列——即使类别是id的一部分 无论如何: select . . . f
transactionId
,该列的值类似于|H000021 | B1 |
我需要与表Category
进行联接,该表有一列CategoryID
,其值类似于H000021
除非数据相同,否则无法应用联接
因此,我想分割或删除TransctionId
中包含的不必要数据,以便可以连接这两个表
请帮助我解决问题。您应该修复数据,使列相同。但有时我们会被其他人糟糕的设计决策所困扰。特别是,事务数据应该包含类别的列——即使类别是id的一部分 无论如何:
select . . .
from transaction t join
category c
on transactionid like '|' + categoryid + |%';
或者,如果类别id始终为7个字符:
select . . .
from transaction t join
category c
on categoryid = substring(transactionid, 2, 7)
您应该修复数据,使列相同。但有时我们会被其他人糟糕的设计决策所困扰。特别是,事务数据应该包含类别的列——即使类别是id的一部分 无论如何:
select . . .
from transaction t join
category c
on transactionid like '|' + categoryid + |%';
或者,如果类别id始终为7个字符:
select . . .
from transaction t join
category c
on categoryid = substring(transactionid, 2, 7)
您可以使用查询执行此操作:
CREATE TABLE #MyTable
(PrimaryKey int PRIMARY KEY,
KeyTransacFull varchar(50)
);
GO
CREATE TABLE #MyTransaction
(PrimaryKey int PRIMARY KEY,
KeyTransac varchar(50)
);
GO
INSERT INTO #MyTable
SELECT 1, '|H000021|B1|'
INSERT INTO #MyTable
SELECT 2, '|H000021|B1|'
INSERT INTO #MyTransaction
SELECT 1, 'H000021'
SELECT * FROM #MyTable
SELECT * FROM #MyTransaction
SELECT *
FROM #MyTable
JOIN #MyTransaction ON KeyTransacFull LIKE '|'+KeyTransac+'|%'
DROP TABLE #MyTable
DROP TABLE #MyTransaction
您可以使用查询执行此操作:
CREATE TABLE #MyTable
(PrimaryKey int PRIMARY KEY,
KeyTransacFull varchar(50)
);
GO
CREATE TABLE #MyTransaction
(PrimaryKey int PRIMARY KEY,
KeyTransac varchar(50)
);
GO
INSERT INTO #MyTable
SELECT 1, '|H000021|B1|'
INSERT INTO #MyTable
SELECT 2, '|H000021|B1|'
INSERT INTO #MyTransaction
SELECT 1, 'H000021'
SELECT * FROM #MyTable
SELECT * FROM #MyTransaction
SELECT *
FROM #MyTable
JOIN #MyTransaction ON KeyTransacFull LIKE '|'+KeyTransac+'|%'
DROP TABLE #MyTable
DROP TABLE #MyTransaction
仅使用代码创建计算列 初始场景:
create table Transactions
(
transactionId varchar(12) primary key,
whatever varchar(100)
)
create table Category
(
transactionId varchar(7) primary key,
name varchar(100)
)
insert into Transactions
select'|H000021|B1|', 'Anything'
insert into Category
select 'H000021', 'A category'
添加计算列:
alter table Transactions add transactionId_code as substring(transactionid, 2, 7) persisted
select *
from Transactions t
inner join Category c on t.transactionId_code = c.transactionId
使用新的计算列进行联接:
alter table Transactions add transactionId_code as substring(transactionid, 2, 7) persisted
select *
from Transactions t
inner join Category c on t.transactionId_code = c.transactionId
获取straighforward查询计划:
仅使用代码创建计算列 初始场景:
create table Transactions
(
transactionId varchar(12) primary key,
whatever varchar(100)
)
create table Category
(
transactionId varchar(7) primary key,
name varchar(100)
)
insert into Transactions
select'|H000021|B1|', 'Anything'
insert into Category
select 'H000021', 'A category'
添加计算列:
alter table Transactions add transactionId_code as substring(transactionid, 2, 7) persisted
select *
from Transactions t
inner join Category c on t.transactionId_code = c.transactionId
使用新的计算列进行联接:
alter table Transactions add transactionId_code as substring(transactionid, 2, 7) persisted
select *
from Transactions t
inner join Category c on t.transactionId_code = c.transactionId
获取straighforward查询计划:
H000021 | B1的实际值是多少|是否|也是该数字的一部分。即使使用
STRING_SPLIT
或其他技术提取值,性能也会受到影响,因为无法使用transactionID
上的索引。您应该修复糟糕的设计,或者添加一个计算列来提取类别ID
,并用索引覆盖它| H000021 | B1 |的实际值是什么| H000021 | B1 |是否也是该数字的一部分。即使使用字符串分割
或其他技术来提取值,性能也会受到影响,因为transactionID
可以使用。您应该修复糟糕的设计,或者添加一个计算列来提取categoryID
,并用索引覆盖它