我得到了两个表,我加入了查询. 连接的表有两列,我需要它们作为查询输出中的单独行;必须省略重复项.

到目前为止,我明白了.

如果联接表的第二列中有一列为空,则也必须省略该行. 我不能满足这个要求.

create table article (id integer, artnum varchar(100), artname varchar(100), PRIMARY KEY (artnum));
 insert into article (id, artnum, artname) values (1, '100', 'apple');
 insert into article (id, artnum, artname) values (2, '101', 'banana');
 insert into article (id, artnum, artname) values (3, '102', 'clementine');
 insert into article (id, artnum, artname) values (4, '103', 'dragon fruit');
--
create table supplier (id integer, supartnum varchar(100), supplier1 varchar(100), supplier1name varchar(100), supplier2 varchar(100), supplier2name varchar(100), PRIMARY KEY (supartnum));
 insert into supplier (id, supartnum, supplier1, supplier1name, supplier2, supplier2name) values (1, '100', '23', 'DZ', '42', 'VZ');
 insert into supplier (id, supartnum, supplier1, supplier1name, supplier2, supplier2name) values (2, '101', '42', 'ZV', '23', 'DZ');
 insert into supplier (id, supartnum, supplier1, supplier1name, supplier2, supplier2name) values (3, '102', '23', 'DZ', '', '');
 insert into supplier (id, supartnum, supplier1, supplier1name, supplier2, supplier2name) values (4, '103', '23', 'DZ', '23', 'DZ');

select artnum, artname, --supplier1name, supplier2name,
(unnest(ARRAY(SELECT DISTINCT e FROM unnest(ARRAY[supplier1name,supplier2name]) AS a(e)))) as "suppliercombo"
from article
join supplier on artnum = supartnum
;

结果:

| artnum | artname      | suppliercombo |
| ------ | ------------ | ------------- |
| 100    | apple        | VZ            |
| 100    | apple        | DZ            |
| 101    | banana       | ZV            |
| 101    | banana       | DZ            |
| 102    | clementine   |               |
| 102    | clementine   | DZ            |
| 103    | dragon fruit | DZ            |

首次出现的102号中庭(克莱门汀)与空的供应商组合帽子被省略. 我try 使用UNION,但都失败了,因为它已经是一个300行的SQL,它将被复制.

例子也在DB Fiddle

推荐答案

如果连接表的第二列中有一列为空,则此行 也必须省略.我不能满足这个要求.

查询可以写成DB-FIDDLE-1中的形式

select artnum, artname, suppliercombo
from (
   select artnum, artname, 
   unnest(array_remove(array[supplier1name, supplier2name], '')) as suppliercombo
  from article
  JOIN supplier ON artnum = supartnum
) t1
group by artnum, artname, suppliercombo
order by artnum;

这给了我正确的输出,如下所示:

artnum artname suppliercombo
100 apple VZ
100 apple DZ
101 banana ZV
101 banana DZ
102 clementine DZ
103 dragon fruit DZ

上面的查询也可以使用UNION简化,如DB-FIDDLE-2

select artnum, artname, suppliercombo
from (
  select artnum, artname, supplier1name as suppliercombo
  from article
  join supplier on artnum = supartnum
  where supplier1name != ''
  union
  select artnum, artname, supplier2name as suppliercombo
  from article
  join supplier on artnum = supartnum
  where supplier2name != ''
) t
group by artnum, artname, suppliercombo
order by artnum;

这也给出了如上所述的预期输出.

Postgresql相关问答推荐

有没有一种方法可以在参数中添加密码,并在批处理文件中需要时自动获取密码?

有没有办法共享数据或监控复杂 PostgresQL 事务的进度?

如何在 postgres 中查询键设置为空值的 jsonb 字段

使用 GDB 调试器调试 AGE 代码的过程

在 PostgreSQL 中 Select 数字命名列会返回 ?column?

查找最小值和最大值

PostgreSQL错误致命:角色 username不存在

Nodejs应用程序的node-postgres vs pg-promise

PostgreSQL - jsonb_each

!= 和 <> 运算符有什么区别?

从 Select 中创建一个临时表,如果表已经存在则插入

在 Windows 10 中执行时,Docker 容器关闭并给出data directory has wrong ownership错误

为 postgresql 存储过程设置隔离级别

解释结果中的Recheck Cond是什么意思?

获取json列键为空的记录

什么是 Postgres session?

带有 WITH 子句的查询时出现 Postgresmissing FROM-clause entry错误

SQLAlchemy 声明式:定义触发器和索引 (Postgres 9)

Postgresql滚动删除旧行?

错误:无法在只读事务中执行 CREATE TABLE