sql - 根据单行匹配选择相关行

标签 sql postgresql

我在 Postgres SQL 9.5 上运行了下表:

+---+------------+-------------+
|ID |  trans_id  |   message   |
+---+------------+-------------+
| 1 | 1234567    | abc123-ef   |
| 2 | 1234567    | def234-gh   |
| 3 | 1234567    | ghi567-ij   |
| 4 | 8902345    | ced123-ef   |
| 5 | 8902345    | def234-bz   |
| 6 | 8902345    | ghi567-ij   |
| 7 | 6789012    | abc123-ab   |
| 8 | 6789012    | def234-cd   |
| 9 | 6789012    | ghi567-ef   |
|10 | 4567890    | abc123-ab   |
|11 | 4567890    | gex890-aj   |
|12 | 4567890    | ghi567-ef   |
+---+------------+-------------+

我正在寻找基于 trans_id 查询的每个 LIKE 的行,如下所示:

SELECT * FROM table 
WHERE message LIKE '%def-234%'

当然,这只返回三行,这三行与我在 message 列中的模式相匹配。相反,我要查找的是匹配消息组中与该 trans_id 匹配的所有行。也就是说,如果单行与模式匹配,则获取所有具有该匹配行的 trans_id 的行。

也就是说,结果将是:

+---+------------+-------------+
|ID |  trans_id  |   message   |
+---+------------+-------------+
| 1 | 1234567    | abc123-ef   |
| 2 | 1234567    | def234-gh   |
| 3 | 1234567    | ghi567-ij   |
| 4 | 8902345    | ced123-ef   |
| 5 | 8902345    | def234-bz   |
| 6 | 8902345    | ghi567-ij   |
| 7 | 6789012    | abc123-ab   |
| 8 | 6789012    | def234-cd   |
| 9 | 6789012    | ghi567-ef   |
+---+------------+-------------+

请注意第 10、11 和 12 行没有被 SELECT 编辑,因为没有一个与 %def-234% 模式匹配。

当单个 message 匹配一个模式时,我已经尝试(但失败了)编写一个子查询来获取所有相关行:

SELECT sub.*
    FROM (
        SELECT DISTINCT trans_id FROM table WHERE message LIKE '%def-234%'
    ) sub
WHERE table.trans_id = sub.trans_id

我可以使用 两个 查询轻松地做到这一点,但是第一个查询要获取要包含在 trans_id 子句中的匹配 WHERE trans_id IN (<huge list of trans_ids>) 的列表会非常大,并且不会是一种非常低效的方法,我相信有一种方法可以通过单个查询来完成。

谢谢!

最佳答案

这将完成我认为的工作:

WITH sub AS (
    SELECT trans_id 
      FROM table 
     WHERE message LIKE '%def-234%'
)
SELECT *
  FROM table JOIN sub USING (trans_id);

希望这对您有所帮助。

关于sql - 根据单行匹配选择相关行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47309984/

相关文章:

mysql自然排序给定数据

MYSQL查询从多个表中选择,按日期排序,不同的表结构

PostgreSQL 迁移和恢复

ruby-on-rails - 尝试在 Heroku 上的 Rails 中将价格设置为扩展十进制/BTC

sql - 根据索引列在 Oracle SQL 中查找 "next 25 rows"

mysql - 替换从左外连接返回的默认空值

mysql - 如何使用mysql通过将特定时间(秒)添加到现有时间戳来更新列中的时间戳值?

sql - 选择具有不匹配 ID 计数的不同元素

php - 在 MAMP 中使用 Laravel 设置 PostgreSQL

arrays - 删除 postgreSQL 中的数组值