【问题标题】:SQL - Return all records if column value matches pattern?SQL - 如果列值与模式匹配,则返回所有记录?
【发布时间】:2015-04-30 10:34:47
【问题描述】:

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

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) 然后返回任何 a.id 的所有记录,该记录具有与搜索字符串匹配的任何 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 或 = 搜索只返回匹配的记录,而不是所有周围的记录(我需要上下文)。

【问题讨论】:

  • 这里没有足够的信息来提供任何可靠的帮助。我假设 Exciter 是您的表,别名为“e”。您发布的查询没有任何别名。我认为您可以使用 where exists 谓词,但如果不查看表结构就很难确定。
  • 还需要查看样本数据和想要的结果。
  • 是什么阻止你从 WHERE e.e_name like XXXX 开始?
  • @Blam 所以我不能使用 LIKE 的原因是因为我不想要匹配 e_name 模式的记录。如果单个记录与 e.e_name 模式匹配,我想获取与 e.e_name 匹配的 a.id 的所有记录。这是因为我不在乎比赛,我在乎的是比赛前后的记录。
  • @TabAlleman 因此,如果我使用 LIKE 或 = 搜索 e.e_name 字符串匹配,则目前我的结果仅返回匹配的 a.id 的记录。我要返回的是具有与搜索模式匹配的任何 e.e_name 记录的任何 a.id 的所有记录。数据结果包含大量私人信息,因此我无法在此处分享结果集。 :(

标签: sql sql-server tsql dataset


【解决方案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)不仅仅是嵌套选择获取过滤的结果集,然后外部选择过滤器仅用于那些满足嵌套选择中过滤条件的 a.name语句的 WHERE 子句? 2)如果我的理解是正确的,这意味着任何其他过滤条件都应该放在您放置 e.e_name 的同一个 WHERE 子句中?谢谢!!!
  • 你的理解是正确的。您只在内部选择中获得满足您条件的 a.names,然后外部选择获取与这些名称关联的所有记录。
【解决方案2】:

首先,我会找到你的 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

也许这会提高一点性能。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    相关资源
    最近更新 更多