postgres sql不返回任何行

时间:2018-03-09 14:20:08

标签: sql postgresql

我有以下3个表:

CREATE TABLE public.a
(
  id bigint NOT NULL DEFAULT nextval('a_id_seq'::regclass),
  CONSTRAINT a_pkey PRIMARY KEY (id)
)

CREATE TABLE public.b
(
  id bigint NOT NULL DEFAULT nextval('b_id_seq'::regclass),
  fkid bigint,
  CONSTRAINT b_pkey PRIMARY KEY (id),
  CONSTRAINT b_fkid_fkey FOREIGN KEY (fkid)
      REFERENCES public.a (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

CREATE TABLE public.history
(

  id bigint NOT NULL DEFAULT nextval('history_id_seq'::regclass),
  CONSTRAINT history_pkey PRIMARY KEY (id)
)

如您所见,表A与表B具有1对多的关系。history表跟踪应用程序内的逻辑时间。以下查询:

WITH main_q AS (
 SELECT 
    a.id
   FROM a
    LEFT JOIN b ON a.id = b.fkid
)
SELECT main_q.id,
    max(history.id) as as_of
FROM main_q,history
GROUP BY 
    main_q.id

即使表A包含行,也不返回任何行,因为History表为空。但是,只要我在历史记录表中添加至少一行,查询就会起作用。

有人可以解释我应该如何修改我的查询,以便即使历史记录为空也会返回行(只要表A包含行)?我希望在NULL列或0中收到as_of值。我尝试COALESCE(max(history.id,0))但这也不起作用,因为历史记录中没有行

编辑示例

Table A content:
id
1
2

Table B content:
id, fkid
1,  2
2,  2

Table History content:
<empty>

2 个答案:

答案 0 :(得分:0)

如果我没有错,你在main_q和历史记录之间执行笛卡尔积,因为你没有连接这两个表的谓词。 可能,当您执行此笛卡尔积时,如果第二个表(历史)为空,则笛卡尔积不返回任何内容。只要您在历史记录中有1条记录,您就会从Main_q获取数据。但是,如果历史记录中有超过1条记录,则由于笛卡尔积,您将开始获取重复数据。

答案 1 :(得分:0)

问题是以下查询

SELECT main_q.id,
    max(history.id) as as_of
FROM main_q,history
GROUP BY 
    main_q.id

为什么不尝试左连接,你可能没有任何东西可以加入,你可以尝试下面的东西

SELECT main_q.id,
        max(history.id) as as_of
    FROM main_q left join history on 1=1
    GROUP BY 
        main_q.id