Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mySQL-根据另一列中的重复项查找唯一列_Mysql_Sql_Duplicates - Fatal编程技术网

mySQL-根据另一列中的重复项查找唯一列

mySQL-根据另一列中的重复项查找唯一列,mysql,sql,duplicates,Mysql,Sql,Duplicates,我一直在调查,但这不是我所需要的,我不知道如何解决它 表:公司 列:id、客户编号、客户名称 可能有许多记录具有相同的客户编号,但所有此类记录应具有相同的客户名称 我尝试编写的查询应显示所有并非如此的记录,如下所示: | id | cust_number | cust_name | | -- | ----------- | --------- | | 10 | 800 | Acme LTD | | 11 | 700 | Globex | | 12 |

我一直在调查,但这不是我所需要的,我不知道如何解决它

表:公司

列:id、客户编号、客户名称

可能有许多记录具有相同的客户编号,但所有此类记录应具有相同的客户名称

我尝试编写的查询应显示所有并非如此的记录,如下所示:

| 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更改为客户编号,请参见编辑。谢谢,粘性位。这是可行的,但查询需要很长时间才能运行。我可能得想另一个办法来解决这个问题。