2014-04-29 72 views
2

我工作的SQL Server 2012年SQL - 比較Table1.items(NTEXT)到Table2.item(VARCHAR)

我想從表1分裂的不同項目與特定的列進行比較表2。

表1有一排這樣的:

| id |   items   | 
| 1  | aaa;ery;sha;cbre;dezrzyg; | 
| 2  | aaa;ery;sha;cbre;dezrzyg; | // Could be the same items than another row 
| 3  | dg;e3ry;sd6ha;cb8re;48dz; | 
| 4  | e5zeza;48;dz;46az;12BREd; | 
| ... |   ...    | 
| 10 |   aaa    | // Currently match because the request compare the whole cell 

項目是一個字符串(ntext在DB)和字符串不會包含空格。

表2有一排這樣的:

| id |   item   | 
| 1  |   aaa    | // match 
| 2  |   AAA    | // match 
| 3  |   aaa52   | // doesn't match 
| 4  |   2aaa2   | // doesn't match 
| ... |   ...    | 

項目也是一個字符串(nvarchar在DB)和從不包含空格的字符串。

這裏是我當前的SQL請求:

SELECT * FROM Table1 t1 
INNER JOIN Table2 t2 ON t1.items = t2.item 

我怎麼能解決我的問題? 我應該分割一個字符串,然後比較每個Table1.itemsTable2.item? SQL中有什麼可以輕鬆解決的嗎?

回答

3

SQL中是否有某些東西可以輕鬆解決它?

不,但您可以創造性地使用like。當你做這樣的事情時,索引不能幫你提高性能。

select * 
from Table1 as T1 
    inner join Table2 as T2 
    on ';'+cast(T1.items as nvarchar(max))+';' like '%;'+T2.item+';%' 

SQL Fiddle

0

故障安全的解決方案是分裂items列的內容轉換成臺狀形式,然後其加入到表2。

說我們有這些表:

create table #t1 (id int, items varchar(100)); 
go 
insert #t1 values 
(1, 'aaa;ery;sha;cbre;dezrzyg;'), 
(2, 'aaa;ery;sha;cbre;dezrzyg;'), 
(3, 'dg;e3ry;sd6ha;cb8re;48dz;'), 
(4, 'e5zeza;48;dz;46az;12BREd;'), 
(10, 'aaa'); 
go 

create table #t2 (id int, item varchar(100)); 
go 
insert #t2 values 
(1, 'aaa'), 
(2, 'AAA'), 
(3, 'aaa52'), 
(4, '2aaa2') 
go 

我們將使用下面的方法來拆分items

select substring(items, n, charindex(';', items + ';', n) - n) 
from numbers, #t1 
where substring(';' + items, n, 1) = ';' 
and n < len(items) + 1 

這需要numbers表,看here如何創建它。

這裏是整個查詢:

select distinct #t1.id, #t1.items, case when #t2.id is null then 'doesn''t match' else 'match' end 
from #t1 
cross apply (
    select substring(items, n, charindex(';', items + ';', n) - n) 
    from numbers 
    where substring(';' + items, n, 1) = ';' 
    and n < len(items) + 1 
) x (col) 
left join #t2 on x.col = #t2.item 
--where #t2.id is not null 
相關問題