考虑查询:
SELECT id, count(id) AS "count"
FROM table
WHERE id IN (
'value1',
'value2',
'value3'
)
GROUP BY id
ORDER BY count ASC;
如果IN
中存在table
个值中的每一个,那么我会得到一个结果:
RESULTS
-------
value1 <value>
value2 <value>
value3 <value>
但是,如果value2
中没有table
,那么我会得到
RESULTS
-------
value1 <value>
value3 <value>
请注意结果中value2
的缺席情况。
我希望value2
显示的值为0
。
对于上下文,我有一个与订阅ID关联的Rep ID表。我想查询这个以获得具有最少量订阅的Rep。问题是此表中的Rep ID并非详尽无遗。因此,我以编程方式查询包含详细的Rep ID列表的单独数据源。我的想法是以某种方式使用详尽的Rep ID列表创建一个查询,以获得我上面提到的所需响应。
有没有人对此有任何想法?我已经看过类似的帖子,其解决方案是使用COALESCE
,但我的子查询返回多个结果,这导致PostgreSQL打嗝。
答案 0 :(得分:5)
您可以使用values()
子句构建一个可以外连接的列表:
SELECT d.id, count(t.id) AS "count"
FROM (
values
('value1'),
('value2'),
('value3')
) as data (id)
left join the_table t on t.id = d.id
GROUP BY d.id
ORDER BY count ASC;
请注意,您必须使用count(t.id)
(计算联接表中的值)才能获得0的计数
或者,如果您不想使用from
子句混淆values
部分,则可以使用公用表表达式:
with data (id) as (
values
('value1'),
('value2'),
('value3')
)
SELECT d.id, count(t.id) AS "count"
FROM data d
left join the_table t on t.id = d.id
GROUP BY d.id
ORDER BY count ASC;
答案 1 :(得分:0)
您可以使用以下查询建立缺失值...测试一下。 希望我能正确理解你的问题。
DROP TABLE TEST2
GO
CREATE TABLE TEST2(ID INT, M1 INT)
GO
INSERT INTO TEST2 VALUES (1,20)
INSERT INTO TEST2 VALUES (2,25)
INSERT INTO TEST2 VALUES (3,30)
GO
SELECT * FROM TEST2
GO
SELECT CONVERT(INT,B.N) AS NB, A.M1 FROM TEST2 A RIGHT JOIN
(
SELECT TOP (SELECT MAX(ID) FROM TEST2) n = ROW_NUMBER() OVER (ORDER BY number) FROM [master]..spt_values AS A
) B
ON A.ID = B.n
GO
DELETE FROM TEST2 WHERE ID =2
GO
SELECT CONVERT(INT,B.N) AS NB, A.M1 FROM TEST2 A RIGHT JOIN
(
SELECT TOP (SELECT MAX(ID) FROM TEST2) n = ROW_NUMBER() OVER (ORDER BY number) FROM [master]..spt_values AS A
) B
ON A.ID = B.n