MySQL - 查找"批处理"的集合之间的不匹配数据

时间:2014-05-23 19:28:32

标签: mysql sql select join

我有一个客户订单数据表,如下所示:

enter image description here

正如您所看到的,有一行用于结算,还有一行用于每个订单的运送。 parent_id是将这些行连接在一起的顺序。我需要做的是编写一个查询,查找所有情况,其中两行之间存在last_name OR zip_code不匹配parent_id(即结算和送货信息不同)。我对如何构造这个查询感到有些失落,因为这不是很明显的原因:

SELECT * 
FROM order_addresses 
WHERE parent_id = parent_id
AND last_name <> last_name

我认为我真正需要做的是查找parent_id匹配FIRST的所有情况,然后逐步查看zip_codelast_name是否也匹配并显示所有结果不。我不知道该怎么做。任何指针都会很棒,谢谢!

2 个答案:

答案 0 :(得分:3)

以下内容如何:

SELECT * 
FROM order_addresses o1
  INNER JOIN order_addresses o2 
  ON o1.parent_id = o2.parent_id 
  AND o1.entity_id <> o2.entity_id
WHERE o1.last_name <> o2.last_name
  OR o1.zip_code <> o2.zip_code

答案 1 :(得分:0)

这是我对此的看法。不是100%肯定它会起作用。 You might be able to pivot it too if you want to look into that。这真的不是很好的桌面设计。

DROP PROCEDURE IF EXISTS sp_BillShipCompare;
CREATE PROCEDURE sp_BillShipCompare();

DELIMITER //

SET @start = (SELECT MIN(parent_id FROM order_addresses);
SET @stop = (SELECT MAX(parent_id FROM order_addresses);

WHILE @start <= @stop DO
BEGIN

SELECT 
    oab.zip_code AS 'billing_zip',
    oas.zip_code AS 'shipping_zip',
    oab.name AS 'billing_name',
    oas.name AS 'shipping_name'
FROM order_addresses AS oab
INNER JOIN order_addresses AS oas
ON oab.parent_id = oas.parent_id
WHERE oab.parent_id = @start
OR oas.parent_id = @start
AND oab.address_type = 'billing'
AND oas.address_type = 'shipping'
AND oab.zip_code <> oas.zip_code
OR oab.name <> oas.name;
SET @start = @start+1;
END;
END WHILE//

DELIMITER ;