【问题标题】:How to compare two rows or get the fields which value is not match with the rows that compared?如何比较两行或获取值与比较的行不匹配的字段?
【发布时间】:2011-04-18 02:58:17
【问题描述】:

我正在尝试根据比较的行获取值不匹配的字段。很难解释,所以我将示例表及其结果。

表格:订单

|  seqid  |  orderId  |  taskId  |  field1  |  field2  |  field3  |  field4  |
+---------+-----------+----------+----------+----------+----------+----------+ 
|  1      |  1        |  1       |  a       |  b       |  c       |  d       |
|  2      |  1        |  2       |  a       |  b       |  c       |  d       |
|  3      |  2        |  1       |  a       |  b       |  c       |  d       |
|  4      |  2        |  2       |  a       |  c       |  c       |  c       |
|  5      |  3        |  1       |  a       |  a       |  a       |  a       |

结果:

|  OrderId  |  FieldName  |  Error  |
+-----------+-------------+---------+
|  2        |  field2     |  1      |
|  2        |  field4     |  1      |

在这里您可以看到orderId 将使用其taskId 进行比较。从 field1 到 field4 是要检查其值是否不匹配的字段。如果是,则获取字段名称。 Error 列不是优先级,可以无视。如果 orderId 只有一个任务,则不会进行比较。

我的第一个计划是使用两个将taskId 分开的查询,然后Java 将完成剩下的工作。但如果可能的话,只需要一个查询就可以了。即使我不了解存储过程,但如果它是唯一的方法,那么让我展示一下,我会检查一下。

我还没有任何有效的查询,甚至没有得到接近我想要的结果。任何答案将不胜感激。谢谢!

更新:

我猜结果很难回答。我将发布另一个我认为很容易解决的结果。

结果2

|  orderId  |  field1  | field2  | field3  |  field4  |
+-----------+----------+---------+---------+----------+
|  1        |  0       | 0       | 0       |  0       |
|  2        |  0       | 1       | 0       |  1       |

对于第二个结果,我需要知道该字段是否具有不匹配的值,如果是,它将显示 1。此结果的过程是将Task = 1Task = 2 的两行与相同的orderId 进行比较.我将过滤Java中具有不匹配值的字段。

我希望这里有人甚至可以回答第二个结果。如果你能回答第一个结果,那将是一个很大的帮助。

【问题讨论】:

    标签: java mysql sql compare


    【解决方案1】:
    SELECT
      orderId,
      CASE MIN(field1) WHEN MAX(field1) THEN 0 ELSE 1 END AS field1,
      CASE MIN(field2) WHEN MAX(field2) THEN 0 ELSE 1 END AS field2,
      ...
    FROM atable
    GROUP BY
      orderId
    

    【讨论】:

    • 感谢这项基于我给定数据的工作。但我想我将它加入到我的查询中会有问题,但我知道这对我来说不会有问题。虽然我已经有一个有效的查询,但我稍后会尝试,以检查哪个更优化。但我想这对我的查询进行了更优化。干得好,再次感谢:)
    【解决方案2】:

    试试这个:

    select orderid
    from orders
    group by orderid
    having count(*) > 1
    and min(field1) <> max(field1) and min(field2) <> max(field2) ...
    

    【讨论】:

    • 我已经尝试过了,但它没有按照我的预期结果工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多