sql - 大小为 0 的 Varchar 字段,但未在 DISTINCT SQL 查询中列出

标签 sql postgresql

这与编程没有直接关系,所以可能是题外话。

为了我的光伏,我已经使用这个 postgres 表好几年了。我做了这样的查询

WITH all_sources AS
(
    SELECT DISTINCT origin from solardata
    ORDER by origin
)
SELECT all_sources.origin, count(*) 
FROM solardata, all_sources
WHERE all_sources.origin = solardata.origin
GROUP BY all_sources.origin
ORDER BY all_sources.origin

我得到了这个结果

                origin                | count  
--------------------------------------+--------
 kostal-log-parser: 10.1.log          |   5905
 kostal-log-parser: 5.5.log           |   6059
 kostal-log-parser: LogDaten_10_1.dat |   3474
 kostal-log-parser: LogDaten_5_5.dat  |   3369
 kostal-web-parser                    | 480869
 time-gridder                         |  18432
(6 rows)

但另一方面,如果我跑

select date_time, origin 
from solardata 
order by date_time limit 2;

我明白了

      date_time      | origin 
---------------------+--------
 2009-08-17 18:34:00 | 
 2009-08-17 18:34:00 | 

这怎么可能?

我的postgres版本是9.4.5


这是解决方案。原因是内部连接,但我需要一个左连接。

WITH all_sources AS
(
    SELECT DISTINCT origin from solardata
    ORDER by origin
)
SELECT all_sources.origin, count(*) 
FROM solardata
LEFT JOIN all_sources on (all_sources.origin = solardata.origin)
GROUP BY all_sources.origin
ORDER BY all_sources.origin

最佳答案

公用表表达式是多余的:

SELECT origin, count(*) 
from solardata 
GROUP BY origin 
ORDER BY origin; 

您的问题出在这里:

WHERE   all_sources.origin = solardata.origin

NULL = NULL => NULL(UKNOWN) 所以该行被跳过。

SqlFiddleDemo_GROUP_BY SqlFiddleDemo_Original

输出:

╔═════════╦═══════╗         ╔═════════╦═══════╗
║ origin  ║ count ║         ║ origin  ║ count ║
╠═════════╬═══════╣         ╠═════════╬═══════╣
║ (null)  ║     2 ║         ║         ║     2 ║
║         ║     2 ║   vs    ║ a       ║     1 ║
║ a       ║     1 ║         ║ b       ║     1 ║
║ b       ║     1 ║         ╚═════════╩═══════╝
╚═════════╩═══════╝

请注意,(null) 组在您的版本中不存在。


您不应该使用它(冗余 cte),但是如果您将 = 更改为 IS NOT DISTINCT FROM,您的查询也会起作用:

WITH all_sources AS
(
    SELECT DISTINCT origin from solardata
)
SELECT all_sources.origin, count(*) 
from solardata
JOIN all_sources
  ON all_sources.origin IS NOT DISTINCT FROM solardata.origin
GROUP BY all_sources.origin
ORDER BY all_sources.origin

关于sql - 大小为 0 的 Varchar 字段,但未在 DISTINCT SQL 查询中列出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34705826/

相关文章:

ruby-on-rails - 库存管理 : How do I handle sold inventory units in the database?

postgresql - 重复函数限制postgresql

java - Spring Data JPA 使用 EclipseLink 作为 JPA 提供者 : possible bug in EclipseLink?

javascript - 使用具有多个搜索条件的 Knex.js 和 SQL 的条件过滤器

mysql - 在 mysql 中使用 JOIN 和子查询

c# - 为什么我们在sql表中插入或更新或删除数据时使用 "@"

SQL 对包含多种类型值的列进行排序

database - 在 Postgres 查询期间设置临时全局变量

java - 有没有一种简单的方法将日期(sql)转换为以下格式月(3个字符)日(int),年(2014)

php - 从多个表中选择并返回全部