让我知道我有一个复杂的查询,它从大量表中获取数据。
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的不同。
答案 0 :(得分:4)
您要求的是分组和使用max
聚合函数的问题。假设你有这个表(你的查询很大,可以在这里粘贴:):
+---------+---------+----------+------------+
|hash |field1 |field2 | field3 |
+---------+---------+----------+------------+
|hash01 |value1 |Null | value3 |
|hash01 |value1 |Null | Null |
|hash01 |value1 |value2 | null |
|hash01 |value1 |Null | value3 |
+---------+---------+----------+------------+
您可以按哈希列进行分组,并在其余部分上应用max
。这样{} 1}优先于字段2中的value2
,而null
将优先于字段3中的value3
。在此示例中,对于相同的哈希,有2 null
。因此value3
函数仍然有效。如果同一列中的同一个哈希值有2个不同的值,那么您应该说明要对它们执行的操作,因为在结果中只能选择一个(基于您的示例)。
因此,对上述结果的查询将类似于:
max
将此应用于您的示例,很可能意味着您必须删除select hash, max(field1) as field1, max(field2) as field2, max(field3) as field3
group by hash
子句并按照我在简化示例中所做的相同方式选择/分组结果。