2011-04-18 52 views
2

我想要获取基于比较行的值不匹配的字段。这很难解释,所以我会把样品表和结果。如何比较两行或获取与比较的行不匹配的字段?

表:订单

| 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进行比较。从字段1到字段4是要检查其值是否不匹配的字段。如果是这样,那么获取字段名称。 Error列不是优先级,您可以忽略它。如果orderId只有一个任务,则不会进行比较。

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

我还没有任何工作查询,甚至没有找到我想要的结果。任何答案将不胜感激。谢谢!

更新:

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

结果2

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

因为我需要知道,如果该字段具有无可比拟的价值,如果是的,它会显示1这个结果的过程是两行这是Task = 1比较第二结果和Task = 2orderId相同。我将过滤在Java中具有无可比拟价值的字段。

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

回答

0
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 
+0

感谢这个工作基础对我给定的数据。但我想我会遇到问题加入到我的查询,但我知道这对我来说不会有问题。尽管我已经有了一个工作查询,我会稍后再尝试,以检查哪个更优化。但我想这是更符合我的查询。干得好,再次感谢:) – ace 2011-04-18 06:37:49

0

试试这个:

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

我已经尝试过了,但它不工作按我的预期结果。谢谢! – ace 2011-04-18 03:55:11