当前位置: 首页 > 知识库问答 >
问题:

将包含一个表类型的列添加到另一个表(Postgres)

魏凯捷
2023-03-14

我有两个数据库表

共有1个答案

计胤
2023-03-14

这是我的一个项目的点点滴滴。此查询比较两个表并将alter table脚本文本生成到“TODO”列中。
“TODO2”是更新查询脚本,用第二个表中的数据更新新列。为了加快alter table部分,您可以将“Default”部分与“Todo”分离,并为另一个“alter table”脚本生成脚本,该脚本在更新完成后仅设置默认值。

除了一些第三方工具之外,没有简单或优雅的方法可以做到这一点。

 select string_agg(todo,'') as todo
       ,'update mytable1 set '|| string_agg(todo2,',') ||' from mytable2 where mytable1.id= mytable2.id'  as todo2
   from (
select  
       case 
         when table1.attname is null 
         then 'alter table '||'mytable1'||' add column '||table2.attname||' '||table2.datatype||' '||case when table2.default_value is null or table2.default_value ='' then ' ' else ' default ' || table2.default_value end ||    ';' 
         end  as todo
      ,case
         when table1.attname is null 
         then  ' '|| table2.attname ||'='|| 'mytable2.'||table2.attname
       end as todo2
 
 from 
 (
 SELECT attname 
      ,pg_catalog.format_type(a.atttypid, a.atttypmod) as Datatype 
      ,coalesce(d.adsrc,'') AS default_value
  FROM pg_catalog.pg_attribute a 
  LEFT JOIN pg_catalog.pg_attrdef d ON (a.attrelid, a.attnum)=(d.adrelid,d.adnum)
 WHERE a.attnum > 0 AND NOT a.attisdropped
   AND a.attrelid = ( SELECT c.oid
                       FROM pg_catalog.pg_class c 
                       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
                      WHERE c.relname = 'mytable1' AND pg_catalog.pg_table_is_visible(c.oid)
                    )
 )table1
 full join  
  (
 SELECT attname 
      ,pg_catalog.format_type(a.atttypid, a.atttypmod) as Datatype 
      ,coalesce(d.adsrc,'') AS default_value
  FROM pg_catalog.pg_attribute a 
  LEFT JOIN pg_catalog.pg_attrdef d ON (a.attrelid, a.attnum)=(d.adrelid,d.adnum)
 WHERE a.attnum > 0 AND NOT a.attisdropped
   AND a.attrelid = ( SELECT c.oid
                       FROM pg_catalog.pg_class c 
                       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
                      WHERE c.relname = 'mytable2' AND pg_catalog.pg_table_is_visible(c.oid)
                    )
 )table2 on (table1.attname = table2.attname)
 where table1.attname is null) q1
 
 
 类似资料:
  • 我在数据库中有一个包含(id、日期、类别、行、持续时间)的表,我每天都有许多注册表,例如(1,12/12/2014,cat1,ligne1,12)(2,12/2014,cat2,ligne1,10)(3,12/12/2014,cat3,ligne2,23) (4,13/12/2014,cat1,LINGE1,10)(5,13/12/2014,cat2,LINGE1,20)(6,13/12/2014

  • 我在从一个表中插入一个列的值作为另一个表中的列时遇到了麻烦。我在col1中有一些值的表A:和另一个列等于col1值的表B。 我想把表A,col1中的其余值添加为表B中的列。请帮助我解决我的问题。我正在使用SQL server 2012。

  • 很抱歉这太模糊了,但代码太多了。 这是一个五卡梭哈游戏。基本上,我试图将对象添加到另一个数组列表中的数组列表中。 这是我创建玩家数组并将手类中的数组添加到其中的地方,至少我认为这就是正在发生的事情: 稍后,我尝试在循环交易中将牌添加到玩家阵列中的手牌阵列中。由于有五张牌,第一个循环进行了五次。第二个是玩家数组的长度(玩家总数),每次应该添加一张卡。 Deck类中有一个deal方法,由以下方法初始化

  • 问题内容: 如何测试一个列表是否包含另一个列表(即它是一个连续的子序列)。假设有一个名为contains的函数: 编辑: 问题答案: 这是我的版本: 正如安德鲁·贾菲(Andrew Jaffe)在他的评论中指出的那样,它返回一个元组(start,end + 1),因为我认为这更像pythonic。它不对任何子列表进行切片,因此应该相当有效。 新手感兴趣的一点是,它使用了for语句上的else子句-

  • 问题内容: 我有两个带有不同对象的列表。 我想检查list2中的元素是否存在于list2中,基于特定的属性(Object1和Object2具有(以及其他),一个共有属性(类型为Long),名为attributeSame)。 现在,我这样做是这样的: 但是我认为有一种更好,更快的方法可以做到这一点:)有人可以提出吗? 谢谢! 问题答案: 如果只需要测试基本相等性,则可以使用基本JDK来完成,而无需在

  • 我有两个不同对象的列表。 我想根据特定的属性(Object1和Object2有一个共同的属性(类型为Long),名为AttributeName),检查list2中是否存在list1中的元素。 现在,我是这样做的: 但我认为有更好更快的方法可以做到这一点:)有人能提出吗? 谢谢