如何拆分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
,并用索引覆盖它