【发布时间】:2017-05-28 06:20:03
【问题描述】:
我正在尝试将法语字符串(语言 ID 1)合并为一列。到目前为止,我能够在table1.title 和table2.translated_topic 中获得法语字符串,但不知道如何连接它们。
版本:Postgres 9.6.0
源表架构:
表一:knowledgebase_topics
id | title | language_id |
------------------------------------
64 | The Topic | 91 |
65 | The Topic 2 | 91 |
62 | Le fav sujet | 1 |
63 | Le fav sujet 2 | 1 |
61 | le bonjour | 1 |
表2:knowledgebase_topics_translations
id | translated_topic| knowledgebase_topic_id | language_id |
-------------------------------------------------------------
| Le sujet | 64 | 1 |
| Le sujet 2 | 65 | 1 |
| Fav The Topic | 62 | 91 |
| Fav The Topic 2 | 63 | 91 |
给定以下查询:
SELECT title, translated_topic, "kbt".language_id, "kbtt".language_id
FROM knowledgebase_topics as "kbt"
LEFT JOIN knowledgebase_topics_translations as "kbtt" on ("kbtt".knowledgebase_topic_id = "kbt".id)
INNER JOIN knowledgebase_topics_organizations as "kbto" on ("kbto".knowledgebase_topic_id = "kbt".id)
WHERE "kbto"."organization_id" = 1
AND to_tsvector("kbt".title) @@ to_tsquery('le')
OR to_tsvector("kbtt".translated_topic) @@ to_tsquery('le')
AND "kbt".language_id = 1
OR "kbtt".language_id = 1;
我得到以下结果:
title | translated_topic | language_id | language_id
----------------+------------------+-------------+-------------
The Topic | Le sujet | 91 | 1
The Topic 2 | Le sujet 2 | 91 | 1
Le fav sujet | Fav The Topic | 1 | 91
Le fav sujet 2 | Fav The Topic 2 | 1 | 91
le bonjour | | 1 |
所需结果: table1.title 和 table2.translated_topics 已基于 language_id == 1 合并。两个表都有一个语言 ID 列。
title | language_id
----------------+--------------
Le sujet | 1
Le sujet 2 | 1
Le fav sujet | 1
Le fav sujet 2 | 1
le bonjour | 1
我该怎么做?
注意:我不想简单地检查 lang IDs = 1,比如
and "kbt".language_id = 1 AND (instead of OR) "kbtt".language_id = 1;
因为这会导致语言 ID 为 1 的 table 2 中的 2 条记录丢失:
title | translated_topic | language_id | language_id
----------------+------------------+-------------+-------------
Le fav sujet | Fav The Topic | 1 | 91
Le fav sujet 2 | Fav The Topic 2 | 1 | 91
le bonjour | | 1 |
所以,我已经让它工作了……但这性能好吗?
SELECT title, "kbt".language_id
FROM knowledgebase_topics as "kbt"
INNER JOIN knowledgebase_topics_organizations as "kbto" on ("kbto".knowledgebase_topic_id = "kbt".id)
WHERE "kbto"."organization_id" = 1
AND to_tsvector("kbt".title) @@ to_tsquery('le')
AND "kbt".language_id = 1
UNION ALL
SELECT translated_topic, "kbtt".language_id
FROM knowledgebase_topics_translations as "kbtt"
INNER JOIN knowledgebase_topics_organizations as "kbto" on ("kbto".knowledgebase_topic_id = "kbtt".id)
WHERE "kbto"."organization_id" = 1
AND to_tsvector("kbtt".translated_topic) @@ to_tsquery('le')
AND "kbtt".language_id = 1;
给出输出:
title | language_id
----------------+-------------
le bonjour | 1
Le fav sujet | 1
Le fav sujet 2 | 1
Le sujet | 1
Le sujet 2 | 1
(5 rows)
【问题讨论】:
-
所以你想要一个只有 'language_id' 1 的结果集?或者一个结果集只有 'language_id' 1 连接的行,而其他值没有?
-
我想要来自
table1.title和table2.translated_topic的所有行,其 language_id == 1,并满足其他约束 (tsvector, tsquery, org ID match, etc). I'd like the result sets in a single column likemerged` -
@MeesKluivers 澄清见上文
-
@MeesKluivers @MeesKluivers 见上文进行澄清。基本上我想合并两个表列的结果,其中
language_id = 1. -
也许你应该看看 CASE。类似于 CASE WHEN kbt.langid = 1 AND kbtt.langid = 1 THEN .. 等postgresql.org/docs/7.4/static/functions-conditional.html
标签: postgresql join merge union