SQL查询合并非空的结果字段

3

假设我有一个复杂的查询,需要从许多表中获取数据。

    SELECT
    DISTINCT
        table1.hash, 
        table2.field1,
        table3.field1,
        table4.field1, 
...
...
...
    FROM table1
    inner JOIN table2
    ON table1.hash=device_model.hash 
        and table1.date = table2.date 
        and table1.time = table2.time

...
...
...
    inner JOIN table_n-1
    ON table1.hash=table_n-1.hash 
        and table1.date = table_n-1.date 
        and table1.time = table_n-1.time
    left JOIN table_n
    ON table1.hash=table_n.hash 
        and table1.date = table_n.date 
        and table1.time = table_n.time
...
...
...
    ORDER BY table1.date

感谢“DISTINCT”运算符,我获得了三行结果,例如:
+---------+----------+------------+
|value1   |Null      | value3     |
+---------+----------+------------+ 
|value1   |Null      | Null       |
+---------+----------+------------+ 
|value1   |value2    | null       |
+---------+----------+------------+ 
|value1   |Null      | value3     |
+---------+----------+------------+ 

我的每一行数据都至少有一个Null值。如何将选择结果合并到一行中以获取所有数据?我希望看到像这样的东西:

+---------+----------+------------+ 
|value1   |value2    | value3     |
+---------+----------+------------+

显然,第一行的value3等于最后一行的value3。因此,结果行仅由Null不同。

按照 value1 字段分组,再排序。 - Mihai
如果你只在第一列上使用 GROUP BY,你仍然会得到重复的结果。也许应该在所有列上使用 GROUP BY - hargobind
1个回答

4
您需要的是分组并使用max聚合函数。假设您有这个表格(您的查询太大了无法在此处粘贴:):
+---------+---------+----------+------------+
|hash     |field1   |field2    | field3     |
+---------+---------+----------+------------+
|hash01   |value1   |Null      | value3     |
|hash01   |value1   |Null      | Null       |
|hash01   |value1   |value2    | null       |
|hash01   |value1   |Null      | value3     |
+---------+---------+----------+------------+

您可以按哈希列进行分组,并在其余部分上应用max。这样,value2将优先于null在field2中,而value3将再次优先于null在field3中。在此示例中,有2个相同哈希的value3。因此,max函数仍将起作用。如果在同一列中存在相同哈希的2个不同值,则应澄清您想要对它们做什么,因为结果中只能选择一个(根据您的示例)。
因此,以上结果的查询可能类似于:
select hash, max(field1) as field1, max(field2) as field2, max(field3) as field3
group by hash

将此应用于您的示例,很可能意味着您必须删除distinct子句,并以我在简化示例中所做的方式选择/分组结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接