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
我下面有一个查询,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