我有以下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>
答案 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