LIKE子句INNER JOIN

时间:2017-05-25 17:57:12

标签: sql sql-server

我有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吗?

3 个答案:

答案 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)

根据您的数据,您可能会发现已经提供的答案已经足够,但我并不热衷于他们......

他们做出两个可能不成立的假设:

  1. “描述”中的下划线不会通过被解释为通配符而与其他数据创建匹配。
  2. TableB添加'BIGAMAN_123456_123456'文件名以说明问题。

    1. 当一个描述与另一个描述匹配时,除了尾部不以下划线开头的“尾部”。
    2. 添加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版本的工作相同,但避免将任何子字符串视为通配符。第二部分获取文件名的其余部分,并检查它是否只包含一个下划线。