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」演算子のおかげで、次のような3行の結果が得られました

+---------+----------+------------+
|value1   |Null      | value3     |
+---------+----------+------------+ 
|value1   |Null      | Null       |
+---------+----------+------------+ 
|value1   |value2    | null       |
+---------+----------+------------+ 
|value1   |Null      | value3     |
+---------+----------+------------+ 

したがって、各行に少なくとも 1 つの Null があります。選択結果を 1 つの行にマージしてすべてのデータを取得するにはどうすればよいですか? 私は次のようなものを見たいです:

+---------+----------+------------+ 
|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 を適用できます。その方法value2は、フィールド 2 よりも優先されnull、フィールド 3value3よりも優先さnullれます。この例ではvalue3、同じハッシュに対して 2 つあります。したがって、max機能は引き続き機能します。同じ列に同じハッシュに対して 2 つの異なる値がある場合は、(例に基づいて) 結果で 1 つしか選択できないため、それらをどうしたいのかを明確にする必要があります。

したがって、上記の結果に対するクエリは次のようになります。

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

これをあなたの例に適用すると、distinct句を削除し、単純化された例で行ったのと同じ方法で結果を選択/グループ化する必要があることを意味する可能性が最も高い.

于 2013-10-28T14:02:56.897 に答える