SQL - 如果列值与模式匹配,则返回所有记录?

时间:2015-02-27 16:27:51

标签: sql sql-server tsql dataset

我在下面有一个查询,它返回一组非常大的数据:

SELECT 
       a.id,
       a.name,
       c.c_name,
       l.t_id,
       t.n_id,
       l.lr_id, 
       l.created, 
       l.am_id, 
       e.e_name

FROM l 
INNER JOIN e 
        ON l.e_id=e.e_id
INNER JOIN t 
        ON l.t_id=t.t_id
INNER JOIN a 
        ON l.a_id=a.a_id
INNER JOIN c 
        ON a.p_c_id=c.c_id

WHERE lower(c.c_name) LIKE 'XXX' and l.date_created > 'YYYY-MM-DD'

ORDER BY a_name, created

这些数据非常有用,但它的数据量非常大,因此很难找到我正在搜索的具体问题。

我希望能够重新编写where子句以在e.e_name列中搜索字符串模式。 (WHERE e.e_name,如XXXX)然后返回任何具有与搜索字符串匹配的e.e_name记录的a.id的所有记录。

如果它有e.e_name匹配,我就无法弄清楚如何返回a.id的所有记录。 :(

编辑:所以简化的数据看起来像

555 | Bob Jones | Staff | 123 | 232 | 454 | 2015-02-27 1:00 | Location 1 
556 | Bob Jones | Staff | 123 | 232 | 456 | 2015-02-27 1:01 | Location 2 

基本上重复鲍勃琼斯的许多地方。所以我要做的就是找到Bob Jones(或任何其他人)的所有记录,这些记录的任何记录的位置都与搜索字符串匹配。我的问题是,执行LIKE或=搜索只返回匹配的记录,而不是所有周围记录(我需要上下文)。

2 个答案:

答案 0 :(得分:1)

你在找这个吗?

SELECT 
       a.id,
       a.name,
       c.c_name,
       l.t_id,
       t.n_id,
       l.lr_id, 
       l.created, 
       l.am_id, 
       e.e_name
FROM l 
INNER JOIN e 
        ON l.e_id=e.e_id
INNER JOIN t 
        ON l.t_id=t.t_id
INNER JOIN a 
        ON l.a_id=a.a_id
INNER JOIN c 
        ON a.p_c_id=c.c_id
WHERE a.name IN (
  SELECT a1.name 
  FROM (All the same joins)
  WHERE e.e_name LIKE '%XXX%'
)
AND l.date_created > 'YYYY-MM-DD'
ORDER BY a_name, created

答案 1 :(得分:0)

首先,我会找到你的c.c_name的所有匹配项并将它们放入临时表中,可能会在其上添加非聚集索引,然后只查询它

这就是我的方法:

SELECT c.c_id, c.c_name
INTO #TempC
FROM c
WHERE c.c_name LIKE 'XXXX'

CREATE NONCLUSTERED INDEX idx_id ON #Temp (c_id)

SELECT 
       a.id,
       a.name,
       c.c_name,
       l.t_id,
       t.n_id,
       l.lr_id, 
       l.created, 
       l.am_id, 
       e.e_name

FROM l 
INNER JOIN e 
        ON l.e_id=e.e_id
INNER JOIN t 
        ON l.t_id=t.t_id
INNER JOIN a 
        ON l.a_id=a.a_id
INNER JOIN #TempC AS C
        ON a.p_c_id=c.c_id

WHERE l.date_created > 'YYYY-MM-DD'

ORDER BY a_name, created

也许这会稍微提高性能。

另外,您的查询使用索引是否正确?