从数据表中获取每两行结果

时间:2012-09-13 13:04:26

标签: sql postgresql select rows

我有一个包含多语言字符串的表格如下:

type_id_fk  lang_id_fk  ui_text   
1           1           "Faktúra"
1           2           "Invoice"
2           1           "Dodací list"
2           2           "Bill of delivery"
3           1           "Objednávka"
3           2           "Order sheet"

我想要一个生成此结果的选择:

1;"Faktúra";"Invoice"
2;"Dodací list";"Bill of delivery"
3;"Objednávka";"Order sheet"

其中,1,2,3来自type_id_fk。我试过Group by,但没有成功。或尝试过这样的事情:

SELECT (t_type.type_id as typeID) ||';'||(
    SELECT t_type_ml.type_name FROM t_type_ml WHERE t_type_ml.type_id_fk = typeID AND t_type_ml.language_id_fk = 1)||';'||(
    SELECT t_type_ml.type_name FROM t_type_ml WHERE t_type_ml.type_id_fk = typeID AND t_type_ml.language_id_fk = 2)||';'
FROM t_type;

但它甚至没有运行。我需要加入吗?谢谢你的帮助

3 个答案:

答案 0 :(得分:2)

SELECT t1.type_id||';'||t1.type_name||';'||t2.type_name
FROM t_type t1 LEFT JOIN t_type t2 ON t1.type_id=t2.type_id AND t2.language_id_fk = 2
WHERE t1.language_id_fk = 1

答案 1 :(得分:2)

或者,您可以转动数据,例如: -

SELECT  TYPE_ID,
    MAX(CASE LANGUAGE_ID WHEN 1 THEN UI_TEXT ELSE NULL END) AS FRENCH,
    MAX(CASE LANGUAGE_ID WHEN 2 THEN UI_TEXT ELSE NULL END AS ENGLISH
FROM    TABLE_NAME
GROUP BY TYPE_ID

答案 2 :(得分:1)

使用聚合函数string_agg()

SELECT type_id_fk, string_agg(ui_text, ';' ORDER BY lang_id_fk)
FROM   t_type
GROUP  BY 1
ORDER  BY 1;

根据汇总字符串中的ORDER BY lang_id_fk添加lang_id_fk个排序 这适用于任何语言,而不仅仅是两种语言的特殊情况。

或者,如果您实际上每行需要一个字符串:

SELECT type_id_fk::text || ';' 
       || COALESCE(string_agg(ui_text, ';' ORDER BY lang_id_fk), 'no text')
...

COALESCE()处理NULL值,如果有的话。