首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在单个查询中从两个表中获取不同的单个列值(而不是不同的对

在单个查询中从两个表中获取不同的单个列值(而不是不同的对
EN

Stack Overflow用户
提问于 2015-03-27 05:08:28
回答 3查看 359关注 0票数 0

我有两个表,如下所示。一是面向部分人群的体育人才,二是面向艺术人才。一个人可能没有体育天赋可以列出,同样适用于艺术人才。

代码语言:javascript
复制
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“。我尝试了以下几种方法

代码语言:javascript
复制
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

我希望避免冗余,需要类似以下的东西(体育人才的独特价值观+艺术人才的独特价值观)。

代码语言:javascript
复制
 s_talent | a_talent 
----------+----------
 Footbal  | Dancer
 Golf     | Singer

正如主题中所提到的,我并不是在寻找不同的组合。但同时,如果在一列中有一些记录的值为"null“,这是可以的。我对SQL比较陌生。

EN

回答 3

Stack Overflow用户

发布于 2015-03-27 06:10:16

尝试:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2015-03-27 06:32:24

您的查询中没有重复项。查询返回中的四条记录中的每一条都是唯一的。这个结果可能不是你想要的,但它的问题似乎不是重复的。

票数 0
EN

Stack Overflow用户

发布于 2015-03-27 07:44:57

Postgres 9.4

..。介绍unnest() with multiple arguments。做你想做的事,而且速度也应该很快。Per documentation:

可以使用任意数量的数组参数调用特殊的表函数UNNEST,它会返回相应的列数,就好像UNNEST (第9.18节)是在每个参数上分别调用并使用ROWS FROM构造组合的一样。

关于ROWS FROM

代码语言:javascript
复制
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或更早版本

代码语言:javascript
复制
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查询中的事件序列:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29288894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档