mySQL-根据另一列中的重复项查找唯一列
我一直在调查,但这不是我所需要的,我不知道如何解决它 表:公司 列:id、客户编号、客户名称 可能有许多记录具有相同的客户编号,但所有此类记录应具有相同的客户名称 我尝试编写的查询应显示所有并非如此的记录,如下所示:mySQL-根据另一列中的重复项查找唯一列,mysql,sql,duplicates,Mysql,Sql,Duplicates,我一直在调查,但这不是我所需要的,我不知道如何解决它 表:公司 列:id、客户编号、客户名称 可能有许多记录具有相同的客户编号,但所有此类记录应具有相同的客户名称 我尝试编写的查询应显示所有并非如此的记录,如下所示: | id | cust_number | cust_name | | -- | ----------- | --------- | | 10 | 800 | Acme LTD | | 11 | 700 | Globex | | 12 |
| id | cust_number | cust_name |
| -- | ----------- | --------- |
| 10 | 800 | Acme LTD |
| 11 | 700 | Globex |
| 12 | 800 | Acme LTD |
| 13 | 444 | Globex |
| 14 | 800 | Acme LTT |
从上表中,查询结果应为:
| id | cust_number | cust_name |
| -- | ----------- | --------- |
| 10 | 800 | Acme LTD |
| 12 | 800 | Acme LTD |
| 14 | 800 | Acme LTT |
因为有多个记录具有相同的客户编号,但所有3个记录的客户名称都不相同
谢谢你的帮助 您可以使用EXISTS检查具有相同客户编号但名称不同的记录
SELECT c1.id,
c1.cust_number,
c1.cust_name
FROM companies c1
WHERE EXISTS (SELECT *
FROM companies c2
WHERE c2.cust_number = c1.cust_number
AND c2.cust_name <> c1.cust_name);
假设MySQL 8.0,您可以为此使用窗口函数:
select id, cust_number, cust_name
from (
select
t.*,
min(cust_name) over(partition by cust_number) min_cust_name,
max(cust_name) over(partition by cust_number) max_cust_name
from mytable t
) t
where min_cust_name <> max_cust_name
您在这里遇到的一个问题可能是MySQL中的字符串比较通常不区分大小写-请参阅 i、 e.选择“Acme有限公司”=“Acme有限公司”;返回1或TRUE 您可以通过比较字符串的二进制表示来避免这种情况;选择二进制“Acme LTD”=二进制“Acme LTD”;返回0 考虑到这一点,下面的查询应该返回您要查找的内容
SELECT DISTINCT t1.id
, t1.cust_number
, t1.cust_name
FROM my_table t1
JOIN my_table t2 ON t2.cust_number = t1.cust_number AND
(BINARY t2.cust_name <> BINARY t1.cust_name)
ORDER BY t1.id;
请向我们展示您的查询尝试了什么?您预期的输出与描述不匹配。@AmanjotKaur,我只在我链接的帖子中尝试了查询。@SalmanA,您确定吗?这3个客户名称并不完全相同。@SalmanA确实如此,只要您考虑到MySQL中的字符串比较将“Acme LTD”和“Acme LTD”计算为相等,而这不是作者想要的。我已经尝试过了,但它没有返回任何内容。请注意,它应该显示具有相同客户编号而不是相同ID的记录。@oldeagle:将ID更改为客户编号,请参见编辑。谢谢,粘性位。这是可行的,但查询需要很长时间才能运行。我可能得想另一个办法来解决这个问题。