【发布时间】:2015-05-31 02:02:47
【问题描述】:
我有两个如下表。一是针对某些人的体育人才,二是针对艺术人才。一个人可能没有要列出的体育人才,同样适用于艺术人才。
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 比较陌生。
【问题讨论】:
-
因此,在您的结果中,s_talent 值和 a_talent 值之间没有关系。您只是有两个并排显示的独立列表?
-
@Vimt 如果您查看数据 steve 踢过足球和高尔夫,如果您将这个结果与 steve 的艺术天赋结合起来,它有舞蹈家和歌手,因此唱歌踢过足球和高尔夫,而歌手踢过高尔夫和足球。这就是解释 4 行结果的原因
-
您运行的是当前版本的 Postgres 9.4 吗? (总是添加你的版本!)
-
@Turophile:是的,两个独立的列表并排显示。 s_talent 和 a_talent 之间没有关系。无论如何,我从 Erwin 和 kordirko 那里得到了答案
标签: sql postgresql outer-join distinct-values