SQL中根据表的顺序选择数据

Posted

技术标签:

【中文标题】SQL中根据表的顺序选择数据【英文标题】:Select Data based on Table's Order in SQL 【发布时间】:2021-07-16 12:52:24 【问题描述】:

我的数据库(sql 服务器)中有 3 个表。第一个表是我的主表,我正在尝试将其他两个表中的新记录更新/插入到我的主表中

基于 3 个标准。

    我想维护主表 tbl1 中的所有记录。

    如果我们在 2 个以上的表(即 tbl2_2020 和 tbl3_2019)中遇到相同 id1、id2、id3、id4 的重复记录,那么我想从最近的记录中获取记录(最近的记录是根据年份选择的在 tbl 名称中)& 最终表中不应有重复记录。

    应该选择 tbl1 中不存在但在 tbl2 或 tbl3 中的唯一记录

    在最后的 tbl 中有一个单独的列来描述记录的来源

---my attempt so far (didnt work though :-) )
select COALESCE(t1.id1, t2.id1, t3.id1) as id1,
       COALESCE(t1.id2, t2.id2, t3.id2) as id2,
       .....so on for all the fields
       from tbl1_2021 t1 full join tbl2_2020 t2 ON
       t1.id1= t2.id and t1.id2=t2.id2 and t1.id3=t2.id3 and t1.id4=t2.id4
       full join
      tbl3_2019 t3 ON
          t2.id1= t3.id1 and t2.id2=t3.id2 and t2.id3=t3.id3 and t2.id4=t3.id4

tb1_2021:(主要tbl)

| id1 | id2 | id3 | id4 | name | age | website | nation | email | address |
| 1   | 11  | 111 | 1111| raj  | 20  | .com    | india  |       | india addr |
| 2   | 22  | 222 | 2222| roger| 21  | .usa    | usa    |x@x.com| usa |

tbl2_2020:

| id1 | id2 | id3 | id4 | website | name | age | nation | email | zipcode | parentname | device |
| 1   | 11  | 111 | 1111| .com    | raj  | 20 | india   |       |         |            |        |
| 3   | 33  | 333 | 3333| .ca     | amy  | 24 | uk      | amy   |  zip333 |  sage      | ipad   |

tbl3_2019:

| id1 | id2 | id3 | id4 | name | age | website | nation | email | address |
| 3   | 33  | 333 | 3333|      |     |         |        |       |         |
| 2   | 22  | 222 | 2222| roger| 21  | .usa    | usa    |x@x.com|        |
| 4   | 44  | 444 | 4444| nick| 28   |  .irl   | uk     |n@n.com| nickadr|

最终表(输出)

| id1 | id2 | id3 | id4 | name | age | website | nation | email | address | source
| 1   | 11  | 111 | 1111| raj  | 20  | .com    | india  |       |india addr| tbl_2021
| 2   | 22  | 222 | 2222| roger| 21  | .usa    | usa    |x@x.com| usa      | tbl_2021
| 3   | 33  | 333 | 3333| amy  | 24  | .ca     | uk     |       |          | tbl_2020
| 4   | 44  | 444 | 4444| nick | 28  | .irl    | uk     |n@n.com| nickaddr | tbl_2019

【问题讨论】:

如果你想要主表中的记录,那么第 3 行和第 4 行是从哪里来的? 如果您每年都有不同的表,那么您就有设计缺陷。希望您提出问题的原因是解决此问题?如果没有,应该是。 然而,你所追求的是FULL OUTER JOIN。或者,您可以在 WHERE 子句中使用 UNION ALLNOT EXISTS 嗨@GordonLinoff,第三和第四条记录来自我在问题中提到的第三条标准。不存在于 tbl1 但存在于 tbl2 或 3 中的唯一记录有资格被挑选。 您好@Larnu,感谢您的反馈!我不否认,不幸的是,我必须仔细研究这些不同的数据块,直到有一个系统到位。 【参考方案1】:

你可以试试下面的查询

SELECT id1
      ,id2
      ,id3
      ,id4
      ,name
      ,age
      ,website
      ,nation
      ,email
      ,address
      ,source
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY id1, id2, id3, id4 ORDER BY a.year DESC) [rowId]
FROM (
    SELECT id1, id2, id3, id4, name, age, website, nation, email, address, 'tbl_2021' source, 2021 [year]
    FROM tbl1_2021
    
    UNION ALL
    
    SELECT id1, id2, id3, id4, name, age, website, nation, email, address, 'tbl_2020' source, 2020 [year]
    FROM tbl2_2020
    
    UNION ALL
    
    SELECT id1, id2, id3, id4, name, age, website, nation, email, address, 'tbl_2019' source, 2019 [year]
    FROM tbl3_2019
    ) a
) b
WHERE b.rowId = 1
    ORDER BY b.id1

【讨论】:

谢谢@Sowmyadhar!我一定会尝试这个查询并在这里发布查询反馈。我感谢你的好意和努力!! :)

以上是关于SQL中根据表的顺序选择数据的主要内容,如果未能解决你的问题,请参考以下文章

如何优化SQL语句

什么是sql中的连接顺序[重复]

SQL 行返回顺序

Oracle初级优化sql

如何根据特定的顺序选择每组的第一行?

Innodb存储表结构