我有两个表,如下所示。一是面向部分人群的体育人才,二是面向艺术人才。一个人可能没有体育天赋可以列出,同样适用于艺术人才。
CREATE TABLE SPORT_TALENT(name varchar(10), TALENT varchar(10));
CREATE TABLE ART_TALENT(name varchar(10), TALENT varchar(10));
INSERT INTO SPORT_TALENT(name, TALENT) VALUES
('Steve', 'Footbal')
,('Steve', 'Golf')
,('Bob' , 'Golf')
,('Mary' , 'Tennnis');
INSERT INTO ART_TALENT(name, TALENT) VALUES
('Steve', 'Dancer')
, ('Steve', 'Singer')
, ('Bob' , 'Dancer')
, ('Bob' , 'Singer')
, ('John' , 'Dancer');现在我想列出一个人的体育天赋和艺术天赋。我想避免重复。但我不介意在任何输出中有"null“。我尝试了以下几种方法
select distinct sport_talent.talent as s_talent,art_talent.talent as a_talent
from sport_talent
JOIN art_talent on sport_talent.name=art_talent.name
where (sport_talent.name='Steve' or art_talent.name='Steve');
s_talent | a_talent
----------+----------
Footbal | Dancer
Golf | Singer
Footbal | Singer
Golf | Dancer我希望避免冗余,需要类似以下的东西(体育人才的独特价值观+艺术人才的独特价值观)。
s_talent | a_talent
----------+----------
Footbal | Dancer
Golf | Singer正如主题中所提到的,我并不是在寻找不同的组合。但同时,如果在一列中有一些记录的值为"null“,这是可以的。我对SQL比较陌生。
发布于 2015-03-27 06:10:16
尝试:
SELECT s_talent, a_talent
FROM (
SELECT distinct on (talent) talent as s_talent,
dense_rank() over (order by talent) as x
FROM SPORT_TALENT
WHERE name='Steve'
) x
FULL OUTER JOIN (
SELECT distinct on (talent) talent as a_talent,
dense_rank() over (order by talent) as x
FROM ART_TALENT
WHERE name='Steve'
) y
ON x.x = y.x演示:http://sqlfiddle.com/#!15/66e04/3
发布于 2015-03-27 06:32:24
您的查询中没有重复项。查询返回中的四条记录中的每一条都是唯一的。这个结果可能不是你想要的,但它的问题似乎不是重复的。
发布于 2015-03-27 07:44:57
Postgres 9.4
..。介绍unnest() with multiple arguments。做你想做的事,而且速度也应该很快。Per documentation:
可以使用任意数量的数组参数调用特殊的表函数
UNNEST,它会返回相应的列数,就好像UNNEST(第9.18节)是在每个参数上分别调用并使用ROWS FROM构造组合的一样。
关于ROWS FROM
SELECT *
FROM unnest(
ARRAY(SELECT DISTINCT talent FROM sport_talent WHERE name = 'Steve')
, ARRAY(SELECT DISTINCT talent FROM art_talent WHERE name = 'Steve')
) AS t(s_talent, a_talent);Postgres 9.3或更早版本
SELECT s_talent, a_talent
FROM (
SELECT talent AS s_talent, row_number() OVER () AS rn
FROM sport_talent
WHERE name = 'Steve'
GROUP BY 1
) s
FULL JOIN (
SELECT talent AS a_talent, row_number() OVER () AS rn
FROM art_talent
WHERE name = 'Steve'
GROUP BY 1
) a USING (rn);类似之前的答案,但有更多解释:
这类似于@kordirko posted,但使用GROUP BY来获取不同的天赋,它在窗口函数之前进行评估。因此,我们只需要一个简单的row_number(),而不需要更昂贵的dense_rank()。
关于SELECT查询中的事件序列:
https://stackoverflow.com/questions/29288894
复制相似问题