我有2个表的问题:
表A
IDA | Description
1 | BIG_MAN
2 | BIG_MANCA
3 | WEB_BrowserCOM
4 | WEB_BrowserCO
5 | Other
表B
IDB | FileName
1 | BIG_MAN_98267828_29292
2 | BIG_MANCA_8282836662_92992
3 | WEB_BrowserCO_7263562_82828
4 | WEB_Browser_28828288_826662
5 | WEB_BrowserCOM_9374664_9933
我想做的是让IDA与表B进行内部联接:
;WITH FileDetails AS
(
SELECT
FL.IDA,
FL.Description
FROM TableA FL
WHERE IsActive = 1
)
SELECT
FD.IDA,
FLL.FileName
FD.Description
FROM TableB FLL
INNER JOIN TableA FD
ON FLL.FileName LIKE (FD.Filename)+'%'
但是我得到了:
IDA | FileName |Description
1 | BIG_MAN_98267828_29292 |BIG_MAN
1 | BIG_MANCA_8282836662_92992 |BIG_MAN
4 | WEB_BrowserCO_7263562_82828 |WEB_BrowserCO
4 | WEB_Browser_28828288_826662 |WEB_BrowserCO
4 | WEB_BrowserCOM_9374664_9933 |WEB_BrowserCO
有什么想法解决这个问题并获得正确的IDA吗?
答案 0 :(得分:2)
您遇到的问题是您的like子句中没有包含尾随下划线。试试这个:
WITH FileDetails AS
(
SELECT
FL.IDA,
FL.Description
FROM TableA FL
WHERE IsActive = 1
)
SELECT
FD.IDA,
FLL.FileName
FD.Description
FROM TableB FLL
INNER JOIN TableA FD
ON FLL.FileName LIKE (FD.Filename)+'$_%' escape '$'
答案 1 :(得分:1)
我怀疑你只需要一个更好的message
模式:
like
这将查找名称后跟下划线。需要SELECT FD.IDA, FLL.FileName, FD.Description
FROM TableB FLL INNER JOIN
TableA FD
ON FLL.FileName LIKE FD.Filename + '%$_%' ESCAPE '$';
因为ESCAPE
是通配符。
答案 2 :(得分:0)
根据您的数据,您可能会发现已经提供的答案已经足够,但我并不热衷于他们......
他们做出两个可能不成立的假设:
向TableB
添加'BIGAMAN_123456_123456'
文件名以说明问题。
添加TableA
'BIG_MAN_7'
的说明以说明问题。
如果SQL-Server具有良好的RegEx对象本机处理能力,我会按照这些方式提出建议,但由于它没有:...
SELECT
FD.IDA,
FLL.FileName,
FD.Description
FROM TableB FLL
INNER JOIN @TableA FD ON
left(FLL.FileName,len(fd.description)+1) = fd.description + '_' AND
len(replace(fll.FileName,fd.description + '_','')) -
len(replace(replace(fll.FileName,fd.description + '_',''),'_','')) = 1
连接的第一部分与like
版本的工作相同,但避免将任何子字符串视为通配符。第二部分获取文件名的其余部分,并检查它是否只包含一个下划线。