Postgresql:如何合并2个查询

时间:2017-10-06 14:38:31

标签: sql postgresql

我有一个案例,我需要结合2个查询来获得预期的结果:

我有两张桌子:

学生

+------+-------+------------------------------------+
| id   | name  | ...                                |
+------+-------+------------------------------------+
| 1    | Tom   | ...                                |
| 2    | Mary  | ...                                |
| 3    | Peter | ...                                |
| 4    | Laura | ...                                |
+------+-------+------------------------------------+

颜色

+------+-------+
| id   | color |
+------+-------+
| 1    | red   |
| 2    | blue  |
+------+-------+

我有2个查询

//Select all student
select name from student

//Select a random color
select color from color
order by random()
limit 1 

如何合并2个查询的结果以获得最终结果。

 +------+-------+-------+
 | id   | name  | team  |
 +------+-------+-------+
 | 1    | Tom   | red   |
 | 2    | Mary  | red   |
 | 3    | Peter | blue  |
 | 4    | Laura | red   |
 +------+-------+-------+

“team”列中的值是表'color'中的随机值。

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:0)

Select S.ID,S.Name,C.color as Team
from student s inner join color c on s.ID=c.ID

答案 1 :(得分:0)

使用两个表的交叉联接和distinct on与适当的order by

select distinct on(s.id, name) s.id, name, color
from student s
cross join color
order by 1, 2, random()

SqlFiddle

请注意

order by 1, 2, random()

表示按第一列,第二列,然后按random()排序,等同于

order by s.id, name, random()

Vide the documentation:

  

SELECT DISTINCT ON(expression [,...])仅保留给定表达式求值的每组行的第一行。使用与ORDER BY相同的规则解释DISTINCT ON表达式(参见上文)。请注意,每个集合的“第一行”是不可预测的,除非使用ORDER BY来确保首先出现所需的行。 (...)DISTINCT ON表达式必须与最左边的ORDER BY表达式匹配。 ORDER BY子句通常包含其他表达式,用于确定每个DISTINCT ON组中行的所需优先级。