我在下面有一个查询,它返回一组非常大的数据:
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或=搜索只返回匹配的记录,而不是所有周围记录(我需要上下文)。
答案 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
也许这会稍微提高性能。
另外,您的查询使用索引是否正确?