ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SQL xin手错误鉴赏

2022-01-31 20:58:46  阅读:152  来源: 互联网

标签:JOIN name xin 鉴赏 client 拼团 SQL id SELECT


文章目录

1. 第一段代码

2. 第二段代码

2.1 题目地址:SQL82 牛客的课程订单分析(六)

# 写出一个sql语句查询在2025-10-15以后,
# 同一个用户下单2个以及2个以上状态为购买成功的
# C++课程或Java课程或Python课程的订单id,是否拼团以及客户端名字信息,
# 最后一列如果是非拼团订单,则显示对应客户端名字,
# 如果是拼团订单,则显示NULL,并且按照order_info的id升序排序

# order_info
# client

SELECT t.id, 
       t.is_group_buy,
       IF(t.is_group_buy = 'Yes', NULL, t.name) AS client_name
FROM (SELECT *,
             COUNT(*) OVER(PARTITION BY user_id) AS cnt  
      FROM   order_info o
      LEFT JOIN   client c
             ON o.client_id = c.id 
      WHERE  date > '2025-10-15'
             AND status = 'completed'
             AND product_name IN ('C++', 'Java', 'Python')
      ) AS t
WHERE t.cnt >= 2
ORDER BY t.id

2.2 报错


Execution Error

SQL_ERROR_INFO: "Duplicate column name 'id'"

2.3 解释

报错原因是参与子查询中参与JOIN的两个表存在相同名称的字段且并非连接字段,即下图的id
在这里插入图片描述

2.4 解决

表格中有相同字段对的情况下,在select 字段的时候需要在其前面指定表格名。比如 SELECT xxx改为SELECT a.xxx

# 写出一个sql语句查询在2025-10-15以后,
# 同一个用户下单2个以及2个以上状态为购买成功的
# C++课程或Java课程或Python课程的订单id,是否拼团以及客户端名字信息,
# 最后一列如果是非拼团订单,则显示对应客户端名字,
# 如果是拼团订单,则显示NULL,并且按照order_info的id升序排序

# order_info
# client


SELECT t.id, 
       t.is_group_buy,
       IF(t.is_group_buy = 'Yes', NULL, t.name) AS client_name
FROM (SELECT o.*, c.name,   # 这里并非全选使用 *,而是指定表格o,为了排除表格c中重复的字段id(也可以选择在外表使用JOIN)
             COUNT(*) OVER(PARTITION BY user_id) AS cnt  
      FROM   order_info o
      LEFT JOIN   client c   # 这里不能使用 INNER JOIN
             ON o.client_id = c.id 
      WHERE  date > '2025-10-15'
             AND status = 'completed'
             AND product_name IN ('C++', 'Java', 'Python')
      ) AS t
WHERE t.cnt >= 2
ORDER BY t.id

2.5 反思

其实这里问题的根源是我将JOIN放在了FROM后面的子查询中,而子查询的SELECT中使用了全选*,这是一条新手经验:使用了JOIN,就要注意对重复字段进行指定表格,包括*

标签:JOIN,name,xin,鉴赏,client,拼团,SQL,id,SELECT
来源: https://blog.csdn.net/Robin_Pi/article/details/122730451

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有