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 的不同。

4

1 回答 1

4

您要求的是分组和使用max聚合函数的问题。假设你有这个表(你的查询很大,可以在这里粘贴:):

+---------+---------+----------+------------+
|hash     |field1   |field2    | field3     |
+---------+---------+----------+------------+
|hash01   |value1   |Null      | value3     |
|hash01   |value1   |Null      | Null       |
|hash01   |value1   |value2    | null       |
|hash01   |value1   |Null      | value3     |
+---------+---------+----------+------------+

您可以按哈希列分组并max在其余列上应用 a。这种方式在 field2 中value2更受欢迎,并且在 field3中再次被首选。在此示例中,相同的哈希有 2 个。所以这个功能仍然可以工作。如果同一列中的同一个哈希有 2 个不同的值,那么您应该澄清您想对它们做什么,因为在结果中只能选择一个(根据您的示例)。nullvalue3nullvalue3max

因此,对上述结果的查询将类似于:

select hash, max(field1) as field1, max(field2) as field2, max(field3) as field3
group by hash

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

于 2013-10-28T14:02:56.897 回答