改进对别名列的搜索

时间:2018-07-02 11:05:20

标签: sql sql-server

看看Linoff编写的以下SQL代码:

approach used by Taryn for SQL concatenation

SELECT a.*, 
       (SELECT STUFF( (SELECT DISTINCT '; ' + r.[description]
                       FROM [tdt_AD_Teste] r
                       WHERE a.pid = r.pid AND
                             r.[displayname] = 'member'
                       FOR XML PATH('')
                      ), 1, 2, ''
                    )
       ) Descript
FROM (SELECT a.pid,
             MAX(CASE WHEN a.displayname = 'name' then [group] end) as name,
             MAX(CASE WHEN a.displayname = 'sd' then [group] end) as sd,
             MAX(CASE WHEN a.displayname = 'description' then [group] end) as description
      FROM tdt_AD_Teste a
      GROUP BY a.pid
     ) a;

此代码将生成5列:pid;名称; sd;描述;描述

我要搜索描述符部分(这是一个别名)...

如果我们写成:

where [Descript] like '%' + '<any_value>'+ '%'

它将抛出无效的列名称'Descript'(查找pid,sd,描述和名称很容易)。

如果我编写的代码与您在上面看到的相同......用包裹,从(代码)b中选择*,其中(...)

SELECT * 
FROM 
   (
   SELECT a.*, 
           (SELECT STUFF( (SELECT DISTINCT '; ' + r.[description]
                           FROM [tdt_AD_Teste] r
                           WHERE a.pid = r.pid AND
                                 r.[displayname] = 'member'
                           FOR XML PATH('')
                          ), 1, 2, ''
                        )
           ) Descript
    FROM (SELECT a.pid,
                 MAX(CASE WHEN a.displayname = 'name' then [group] end) as name,
                 MAX(CASE WHEN a.displayname = 'sd' then [group] end) as sd,
                 MAX(CASE WHEN a.displayname = 'description' then [group] end) as description
          FROM tdt_AD_Teste a
          GROUP BY a.pid
         ) a ) b
 WHERE b.Descript like '%' + '<any_value> + '%' ;

它可以工作,但是找到一些字符串需要太多时间....(可能需要20 s ...)。有没有一种更快的方法来搜索这种情况?

1 个答案:

答案 0 :(得分:2)

您不必生成字符串-假设您要查找的是一行描述。您可以这样做:

SELECT a.pid,
       MAX(CASE WHEN a.displayname = 'name' then [group] end) as name,
       MAX(CASE WHEN a.displayname = 'sd' then [group] end) as sd,
       MAX(CASE WHEN a.displayname = 'description' then [group] end) as description
FROM tdt_AD_Teste a
GROUP BY a.pid
HAVING SUM(CASE WHEN description LIKE '%' + <any value> + '%' THEN 1 ELSE 0 END) > 0;

您可以在FROM的子查询中使用它,然后将外部查询中的描述连接起来。