【问题标题】:Concise SQL for joining many tables on a single column用于在单个列上连接多个表的简洁 SQL
【发布时间】:2021-03-01 20:55:09
【问题描述】:

我有大约 122 个表,它们都共享一个特定的列。是否有一种优雅/简洁的方法可以在没有 121 个实例的情况下加入该列上的所有这些表

加入 A.id = B.id

在查询中?

【问题讨论】:

  • 只是想知道:您的数据库的设计是什么,您需要回答什么问题需要这样的查询?我认为 DBMS 中 JOUNed 表的限制是无法达到的
  • 为了复制粘贴条件,您可以在 JOIN 中使用 USING 关键字
  • EAV 数据模型?
  • 如果你需要加入 121 个表,你需要 121 个 JOIN 条件。但这听起来像是一个相当奇怪的数据模型,如果有必要的话

标签: sql postgresql


【解决方案1】:

如果有问题的列在两个表中具有相同的名称(应该如此),那么您可以使用以下更短的语法:

SELECT ... FROM table1 JOIN table2 USING (column)

该列也只会在结果中出现一次,而不是出现在每个表格中。更多详情here.

不过,您仍然需要为每张桌子执行此操作。

【讨论】:

    【解决方案2】:

    这是你的解决方案:

    创建表并插入语句:

    create table splitUpdate (no int,productname varchar(10),productcrossell varchar(20));
    insert into splitUpdate values (1,'a','a(1)');
    insert into splitUpdate values (2,null,'c(4),d(5)');
    insert into splitUpdate values (3,null,'Z(1),b(2)');
    
    create table eleminate (product varchar(20));
    insert into eleminate values('x');
    insert into eleminate values('y');
    insert into eleminate values('Z');
    insert into eleminate values('z');
    

    更新查询:

    with cte as (
        select no,productname,p.product,row_number()over(partition by no)rn ,substring(p.product  from 1 for position('(' in p.product )-1) SplittedProduct
    from splitupdate t, unnest(string_to_array(t.productcrossell ,','))p(product)
    where substring(p.product  from 1 for position('(' in p.product )-1) not in (select product from eleminate))
    update splitupdate set productname=splittedproduct 
    from cte 
    where splitupdate.productname is null and splitupdate.no=cte.no and cte.rn=1 
    

    更新前拆分更新表:

    |no|productname|productcrossell| 
    |1 |a          |a(1)           |
    |2 |c          |c(4),d(5)      |
    |3 |b          |Z(1),b(2)      |
    

    结果:

    |no|productname|productcrossell| 
    |1 |a          |a(1)           |
    |2 |c          |c(4),d(5)      |
    |3 |b          |Z(1),b(2)      |
    

    【讨论】:

      猜你喜欢
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 2016-09-10
      相关资源
      最近更新 更多