我有一个客户订单数据表,如下所示:
正如您所看到的,有一行用于结算,还有一行用于每个订单的运送。 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_code
和last_name
是否也匹配并显示所有结果不。我不知道该怎么做。任何指针都会很棒,谢谢!
答案 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 ;