我在 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/