【问题标题】:Inner join SQL with like operator内连接 SQL 与 like 运算符
【发布时间】:2018-05-08 01:12:55
【问题描述】:

我的主表有一个用于搜索查询的列。 一个简化的例子:

查询表

id   query
1    hello new york
2    no information here
3    madison festival 

地理位置

id   suburb     postcode
11    new york   123
12    brooklyn   345
13    madison    999

如果搜索查询有位置,我想在示例结果中检索邮政编码,如下所示:

id     query             suburb      postcode
1      hello new york    new york    123
3      madison festival  madison     999

我目前正在通过 SQL 执行此操作并返回所需的结果(几乎:如果 `inform' 是一个郊区,它将被检索到,尽管我们想要匹配完整的单词)。

SELECT QT.id, query, suburb, postocde
FROM Querytable as QT
INNER JOIN Geotable ON query LIKE concat('%',suburb,'%');

由于上述表格很大,我该如何改进这个查询?或者有没有更好的方法来解决这个问题?

【问题讨论】:

  • 你不能使用像LIKE CONCAT('suburb, '%') 这样的东西 - 你的查询将能够使用索引(sargable)。您可以使用COMPUTED 列来大写evertything - 即纽约变成纽约 - 更容易搜索! PostgreSQL 有这些。
  • @Vérace:不,遗憾的是 Postgres 没有计算列。
  • @a_horse_with_no_name 感谢您的提醒 - Postgres 团队绝对应该考虑他们 - 他们是天赐之物。您也可以使用TRIGGER 或使用VIEWSELECTing 来实现!

标签: sql postgresql performance


【解决方案1】:

从您的表中,我认为 JOIN 应该在列 ID 上,而您的 LIKE 应该在 WHERE 中,而不是在 JOIN 中。所以像这样的东西

SELECT QT.id, query, suburb, postocde
FROM Querytable as QT
INNER JOIN Geotable GT ON QT.id=GT.id 
WHERE query LIKE concat('%',suburb,'%');

但即便如此,如果 `inform' 是郊区,它将被检索,因为它匹配类似的 '%inform%' 条件。你在那个表中有索引来提高性能吗?你把索引放在哪一列?

【讨论】:

  • QT.id 和 GT.id 不相关,因此无法加入它们。我的查询检索了我给出的输出。
  • 好吧,根据您的数据,我认为 id 是一个 FK,因为它看起来像 GT(纽约郊区)中的 id 1 与 QT(你好纽约查询)中的 id 1 匹配,与 id 3 相同(两者均指麦迪逊)。对此感到抱歉
  • 哦,是的!这看起来确实令人困惑。会解决的,谢谢!
【解决方案2】:

我对您的查询进行了一些更改,并为我提供了所需的结果。试试这个。

SELECT QT.id, query, suburb, postcode
FROM Querytable as QT
INNER JOIN Geotable ON concat(query,Space(1)) LIKE concat('%',suburb,'[ ]%')

【讨论】:

  • 这种语法似乎不适用于 postgresql。我尝试手动添加空间,但仍然检索到 id=2。
  • 我在 MSSQL 中尝试过,它看起来不错,只返回 1 和 3
猜你喜欢
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 2012-01-21
  • 2022-10-01
  • 2014-07-12
  • 1970-01-01
  • 2017-08-22
  • 2017-03-29
相关资源
最近更新 更多