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

SQL - Return all records if column value matches pattern?

我下面有一个查询,return是一组非常大的数据:

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 like XXXX)然后 return 任何 a.id 的所有记录,其中任何 e.e_name 记录与搜索字符串匹配。

我只是不知道如何 return 一个 a.id 的所有记录,如果它有一个 e.e_name 匹配。 :(

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

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。所以我想做的是找到 Bob Jones(或任何其他人)的所有记录,这些记录的位置与搜索字符串匹配。我的问题是,执行 LIKE 或 = 搜索 returns 仅匹配的记录,而不是所有周围的记录(我需要上下文)。

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

这就是我的方法:

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

也许这会稍微提高性能。

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

你在找这个吗?

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