【问题标题】:How to insert unique ID from subquery into a table?如何将子查询中的唯一 ID 插入表中?
【发布时间】:2021-07-20 12:36:21
【问题描述】:

我有两个 SQL Server 表:users_flagsusers

users:

user_id email_address
1 john@company.com
2 amy@company.com
3 john@company.com
2 amy@company.com

users_flags:

flag_id user_id

如何将users 表中的所有唯一 user_id 值插入users_flags 表,使用子查询按email_address 过滤?

例如,我有一个电子邮件地址列表,我需要检索user_id 用于:

SELECT user_id FROM users
WHERE email_address IN ('john@company.com',
                        'amy@company.com',
                        'guster@company.com')

通常,我会将其用作INSERT 语句的子查询(我需要对flag_id 进行硬编码):

INSERT INTO users (flag_id, user_id)
SELECT 3,
       user_id
FROM users
WHERE email_address IN ('john@company.com',
                        'amy@company.com',
                        'guster@company.com')

但是,由于我的 users 数据集当前有一些重复数据,我只需要从该表中获取 DISTINCT user_id 记录。

我不能在我的子查询中对user_id 使用DISTINCT 关键字(语法无效)。如何更新我的 INSERT 语句以仅考虑唯一用户 ID?

【问题讨论】:

  • 例如:子查询...
  • 正确的sintax是SELECT DISTINCT 3, user_id ...,你可能输入了SELECT 3, DISTINCT user_id...
  • @JaimeDrq - 这正是我做错的,你是对的。谢谢!
  • 有一些重复的数据修复它并应用适当的约束来防止它。不应避免数据质量问题,否则必须编写使用此信息的每个查询来解决此问题。

标签: sql sql-server


【解决方案1】:

使用窗口函数 row_number()

INSERT INTO users (flag_id, user_id)
SELECT *
FROM
  (SELECT 3 as flag_id,
       user_id,
       row_number() over(partition by user_id order by (select null)) as seq
  FROM users
  WHERE email_address IN ('john@company.com',
                        'amy@company.com',
                        'guster@company.com')) T
WHERE seq = 1

【讨论】:

    【解决方案2】:

    你应该可以使用select distinct:

    INSERT INTO users (flag_id, user_id)
        SELECT DISTINCT 3, user_id
        FROM users
        WHERE email_address IN ('john@company.com',
                                'amy@company.com',
                                'guster@company.com');
    

    【讨论】:

      【解决方案3】:

      他们有很多解决方案来避免重复,例如:

      NOT EXISTS

      INSERT INTO users (flag_id, user_id)
      SELECT u.3,
         u.user_id
        FROM users u
       WHERE NOT EXISTS(SELECT user_id
                          FROM users u2 
                         WHERE u2.user_id = u.user_id)
      

      【讨论】:

        【解决方案4】:
        ;with Temp as(
        
        SELECT Distinct user_id FROM users
        WHERE email_address IN ('john@company.com',
                            'amy@company.com',
                            'guster@company.com')
        )
        
        INSERT INTO users (flag_id, user_id) select 3, user_id from Temp
        

        上述解决方案几乎适用于所有数据库

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-11-03
          • 1970-01-01
          • 1970-01-01
          • 2014-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多