Postgresql 基于表值合并两列

Postgresql 基于表值合并两列,postgresql,join,merge,union,Postgresql,Join,Merge,Union,我正在尝试将法语字符串(语言ID 1)合并到一列中。到目前为止,我能够在table1.title和table2.translated\u topic中获得法语字符串,但不确定如何连接它们 版本:Postgres 9.6.0 源表架构: 表1:knowledgebase\u主题 id | title | language_id | ------------------------------------ 64 | The Topic | 91

我正在尝试将法语字符串(语言ID 1)合并到一列中。到目前为止,我能够在
table1.title
table2.translated\u topic
中获得法语字符串,但不确定如何连接它们

版本:Postgres 9.6.0

源表架构:

表1:
knowledgebase\u主题

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\u主题\u翻译

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 |     
所需结果:
表1.标题
表2.翻译的主题
已根据
语言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 id=1,例如

and "kbt".language_id = 1 AND (instead of OR) "kbtt".language_id = 1;
因为这会导致语言ID 1的
表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)
建立一个环境来回答这个问题 首先,观察我们如何用简洁的DDL最好地描述问题。最好在将来,你会学会如何写这样的问题

CREATE TEMPORARY TABLE knowledgebase_topics AS
SELECT * FROM ( VALUES
  (64,'The Topic',91),
  (65,'The Topic 2',91),
  (62,'Le fav sujet',1),
  (63,'Le fav sujet 2',1),
  (61,'le bonjour',1)
) AS t(knowledgebase_topic_id, title, language_id);

CREATE TEMPORARY TABLE knowledgebase_topics_translations AS
SELECT * FROM ( VALUES
  ('Le sujet'       ,64,1  ),
  ('Le sujet 2'     ,65,1  ),
  ('Fav The Topic'  ,62,91 ),
  ('Fav The Topic 2',63,91 )
) AS t(translated_topic, knowledgebase_topic_id, language_id);
然后你只需要告诉我们你想要什么,我们就可以很容易地建立一个工作环境并回答你的问题。不需要英语!对我们两个都好

解决方案 在这里,我们使用一个
UNION ALL
将其包装在一个
SELECT
中,这样我们就可以按id进行排序,并在一个地方轻松地更改您要查找的
语言

SELECT title, language_id
FROM (
  SELECT knowledgebase_topic_id, title, language_id
  FROM knowledgebase_topics
  UNION ALL
  SELECT knowledgebase_topic_id, translated_topic, language_id
  FROM knowledgebase_topics_translations
) AS t(id, title, language_id)
WHERE language_id = 1
ORDER BY id;
输出 建立一个环境来回答这个问题 首先,观察我们如何用简洁的DDL最好地描述问题。最好在将来,你会学会如何写这样的问题

CREATE TEMPORARY TABLE knowledgebase_topics AS
SELECT * FROM ( VALUES
  (64,'The Topic',91),
  (65,'The Topic 2',91),
  (62,'Le fav sujet',1),
  (63,'Le fav sujet 2',1),
  (61,'le bonjour',1)
) AS t(knowledgebase_topic_id, title, language_id);

CREATE TEMPORARY TABLE knowledgebase_topics_translations AS
SELECT * FROM ( VALUES
  ('Le sujet'       ,64,1  ),
  ('Le sujet 2'     ,65,1  ),
  ('Fav The Topic'  ,62,91 ),
  ('Fav The Topic 2',63,91 )
) AS t(translated_topic, knowledgebase_topic_id, language_id);
然后你只需要告诉我们你想要什么,我们就可以很容易地建立一个工作环境并回答你的问题。不需要英语!对我们两个都好

解决方案 在这里,我们使用一个
UNION ALL
将其包装在一个
SELECT
中,这样我们就可以按id进行排序,并在一个地方轻松地更改您要查找的
语言

SELECT title, language_id
FROM (
  SELECT knowledgebase_topic_id, title, language_id
  FROM knowledgebase_topics
  UNION ALL
  SELECT knowledgebase_topic_id, translated_topic, language_id
  FROM knowledgebase_topics_translations
) AS t(id, title, language_id)
WHERE language_id = 1
ORDER BY id;
输出

所以你想要一个只有'language_id'1的结果集?或者一个结果集,它只包含连接了'language_id'1的行,而其他值没有连接?我想要
table1.title
table2.translated_topic
中的所有行,这些行的语言_id==1,并且满足其他contstraint(
tsvector,tsquery,org id match,等等)。我希望将结果集放在一列中,如
merged`@MeesKluivers请参见上面的内容clarification@MeesKluivers@MeesKluivers请参见上文以了解澄清。基本上,我想合并两个表列的结果,其中
language\u id=1。
也许您应该检查CASE。类似于当kbt.langid=1和kbtt.langid=1时的情况。。等等。那么你想要一个只有'language_id'1的结果集?或者一个结果集,它只包含连接了'language_id'1的行,而其他值没有连接?我想要
table1.title
table2.translated_topic
中的所有行,这些行的语言_id==1,并且满足其他contstraint(
tsvector,tsquery,org id match,等等)。我希望将结果集放在一列中,如
merged`@MeesKluivers请参见上面的内容clarification@MeesKluivers@MeesKluivers请参见上文以了解澄清。基本上,我想合并两个表列的结果,其中
language\u id=1。
也许您应该检查CASE。类似于当kbt.langid=1和kbtt.langid=1时的情况。。等等@Growler我个人会改变这个。我会选择一种主要语言——对于第三方工具来说,你真的有太多了——一种索引语言。然后,如果没有索引,我会将这些翻译放在JSONB中。或者,我会根据他们的名字和翻译把他们放在不同的栏目里<代码>创建表电影_表(id序列主键、名称文本、fr文本)。等等,我不会加入时尚界。您有一个主表和一个辅助表。我不知道为什么。你想把他们当作一个人来问,这告诉我你也不知道为什么。埃文,你帮了我(希望还有其他人)很大的忙,为我提供了一个问题的答案和一个写更好问题的例子。非常感谢!!如果您想获得有关性能等方面的信息,还可以尝试dba.stackexchange.com。当需要查询时,始终提供DDL以生成查询(创建表为SELECT),或者如果需要性能建议(始终提出另一个问题)并粘贴查询,以及
EXPLAIN ANALYZE
的输出。Evan在您选择的第一个表中没有
knowledgebase\u topic\u id
knowledgebase\u topics
。您可能想将其更改为
id
,同时检查
组织\u id
是否存在?@Growler我个人会更改此设置。我会选择一种主要语言——对于第三方工具来说,你真的有太多了——一种索引语言。然后,如果没有索引,我会将这些翻译放在JSONB中。或者,我会根据他们的名字和翻译把他们放在不同的栏目里<代码>创建表电影_表(id序列主键、名称文本、fr文本)。等等,我不会加入时尚界。您有一个主表和一个辅助表。我不知道为什么。你想把他们当作一个人来问,这告诉我你也不知道为什么。埃文,你帮了我(希望还有其他人)很大的忙,为我提供了一个问题的答案和一个写更好问题的例子。非常感谢!!如果您想获得有关性能等方面的信息,还可以尝试dba.stackexchange.com。需要查询时,始终提供DDL以生成查询(创建表为SELECT),或者如果需要性能建议(始终提出另一个问题)并粘贴查询,并输出
EXPLAIN ANALYZE