【问题标题】:Select primary phone number (if exist) else select the latest phone number one using SQL选择主要电话号码(如果存在),否则使用 SQL 选择最新的电话号码一
【发布时间】:2021-08-05 15:51:04
【问题描述】:

这是场景,

表 1:

Phone Number id Person_id
12345 001
12346 001
12347 001
12348 002
12349 002
12350 003

表 2:

Person_id primary phone id
001 12346
002
003 12350

有两个表,table1 和 table2 我想根据 person_id 获取电话号码,条件是,

如果电话号码 id 是主要的(存在于 table2 中是主要的),请选择主要号码,否则选择较少的电话号码

例如 这就是我想要的,我使用了子查询,但它使 200 000 个人 id 的查询速度变慢

输出:

Person_id Phone Number id
001 12346
002 12348
003 12350

【问题讨论】:

  • 这是什么意思? “选择较少的电话号码”。小于什么?
  • 我的意思是更小。例如对于 id 002,电话号码 id 应该是 12348 而不是 12349
  • 嗨@VishalYadav你使用哪个mysql版本?所有列数据类型都是字符串还是整数?
  • Oracle 数据库。无需担心数据类型。
  • MySQL 和 Oracle 是完全不同的产品。既然你说是Oracle,那我就换了你的tag。

标签: sql oracle


【解决方案1】:

在大表中使用子查询在性能方面并不好。我建议离开连接表并从第二个表中获取最小值或最大值。

       SELECT NVL (t1.phone_number, t1.phone_number) phone_number
  FROM table1 t1
       LEFT JOIN (SELECT MIN (phone_number) AS phone_number, person_id
                    FROM table2
                  GROUP BY person_id) t2
           ON t1.person_id = t2.person_id

【讨论】:

    【解决方案2】:

    如果您想要第一个表中没有第二个表中的最小数字,那么一种方法使用相关子查询:

    select t2.personid, 
           coalesce(t2.primary_phone_number,
                    (select min(t1.phone_number)
                     from table1 t1
                     where t1.personid = t2.personid
                    )
                   ) as imputed_primary_phone_number
    from table2 t2;
    

    【讨论】:

      【解决方案3】:

      如果 table2 中的每个 person_id 至少存在一个电话号码,则使用 INNER JOIN 而不是 LEFT JOIN。子查询块返回人员明智的最小电话号码。然后它与 table1 连接以获得预期的结果。

      -- MySQL (v5.6)
      SELECT t.person_id
           , COALESCE(t.primary_phone_id, p.phone_number_id) phone_number_id
      FROM table2 t
      LEFT JOIN (SELECT person_id
                      , MIN(phone_number_id) phone_number_id
                 FROM table1
                 GROUP BY person_id) p
             ON t.person_id = p.person_id;  
      

      请查看网址http://sqlfiddle.com/#!9/20512e/3

      【讨论】:

      • 嗨@VishalYadav,请检查查询,如果有任何查询,请告诉我。我写了这篇关于优化或大型数据集的思考。
      猜你喜欢
      • 2014-08-24
      • 2011-10-25
      • 2017-03-05
      • 1970-01-01
      • 2018-07-23
      • 2022-01-18
      • 2018-10-09
      • 2013-03-07
      • 1970-01-01
      相关资源
      最近更新 更多