具有从列派生的动态表名称的左连接

2023-11-25

我是 PostgreSQL 的新手,我想知道是否可以使用number从表tbc作为左连接中表名的一部分'pa' || number。例如,如果数字是 456887,我想要与表 pa456887 进行左连接。像这样的东西:

SELECT tdc.cpa, substring(tdc.ku,'[0-9]+') AS number, paTab.vym 
FROM public."table_data_C" AS tdc
LEFT JOIN concat('pa' || number) AS paTab ON (paTab.cpa = tdc.cpa)

我只想使用 PostgreSQL,而不是 PHP 中的其他代码。


无论哪种方式,您都需要动态 SQL。

表名作为给定参数

CREATE OR REPLACE FUNCTION foo(_number int)
  RETURNS TABLE (cpa int, nr text, vym text) AS  -- adapt to actual data types!
$func$
BEGIN
   RETURN QUERY EXECUTE format(
      'SELECT t.cpa, substring(t.ku,'[0-9]+'), p.vym 
       FROM   public."table_data_C" t
       LEFT   JOIN %s p USING (cpa)'
     , 'pa' || _number
     );
END
$func$ LANGUAGE plpgsql;

Call:

SELECT * FROM foo(456887)

一般来说,您可以使用以下命令来清理表名称format ( %I )以避免SQL注入。只需一个integer作为动态输入,这是不必要的。此相关答案中的更多详细信息和链接:
在触发器函数中使用动态表名进行 INSERT

数据模型

数据模型可能有充分的理由。比如分区/分片或单独的权限......
如果您没有这样充分的理由,请考虑将具有相同架构的多个表合并为一个,然后添加number作为列。那么你就不需要动态SQL了。

考虑遗产。然后你可以添加一个条件tableoid仅从给定子表中检索行:

SELECT * FROM parent_table
WHERE  tableoid = 'pa456887'::regclass

但请注意继承的限制。相关回答:

  • 查询行继承自的父表时获取行的源表的名称
  • 使用 Postgres 从多个模式中选择(检索)所有记录

第二个表的名称取决于第一个表中的值

从第一个表中的值派生连接表的名称会动态地使事情变得复杂。

只适合几张桌子

LEFT JOIN每个上tableoid。每行只有一个匹配项,因此使用COALESCE.

SELECT t.*, t.tbl, COALESCE(p1.vym, p2.vym, p3.vym) AS vym
FROM  (
   SELECT cpa, ('pa' || substring(ku,'[0-9]+'))::regclass AS tbl
   FROM   public."table_data_C"
   -- WHERE <some condition>
   ) t
LEFT   JOIN pa456887 p1 ON p1.cpa = t.cpa AND p1.tableoid = t.tbl
LEFT   JOIN pa456888 p2 ON p2.cpa = t.cpa AND p2.tableoid = t.tbl
LEFT   JOIN pa456889 p3 ON p3.cpa = t.cpa AND p3.tableoid = t.tbl

对于许多桌子

将循环与动态查询结合起来:

CREATE OR REPLACE FUNCTION foo(_number int)
  RETURNS TABLE (cpa int, nr text, vym text) AS
$func$
DECLARE
   _nr text;
BEGIN
FOR _nr IN
   SELECT DISTINCT substring(ku,'[0-9]+')
   FROM   public."table_data_C"
LOOP
   RETURN QUERY EXECUTE format(
      'SELECT t.cpa, _nr, p.vym 
       FROM   public."table_data_C" t
       LEFT   JOIN %I p USING (cpa)
       WHERE  t.ku LIKE (_nr || '%')'
     , 'pa' || _nr
     );
END LOOP;

END
$func$ LANGUAGE plpgsql;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有从列派生的动态表名称的左连接 的相关文章

  • Oracle:使用SQL或PL/SQL查找动态SQL中的错误位置

    如何在 PL SQL 或 SQL 中找到动态 SQL 语句中的错误位置 从 SQL Plus 中 我看到了错误的位置 例如 无效的 SQL DML 语句 SYS orcl gt SELECT 2 X 3 FROM 4 TABLEX 5 TA
  • 如何在不运行 PostgreSQL 服务器的情况下初始化 PostgreSQL 数据库

    在初始化脚本中 我想初始化 PostgreSQL 目录 但在此阶段不需要 也不希望 正在运行的 PostgreSQL 服务器 如果我只是创建集群 作为用户postgres initdb D 但是 我还需要创建 PostgreSQL 角色 创
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 PostgreSQL 中使用具有多个值的 SQL LIKE 条件?

    有没有更短的方法来查找多个匹配项 SELECT from table WHERE column LIKE AAA OR column LIKE BBB OR column LIKE CCC 这个问题适用于 PostgreSQL 9 1 但如
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • 当所有维度值都具有 100% 重要性时处理多对多维度

    我至少会尽力保持简洁 假设我们正在跟踪一段时间内的账户余额 所以我们的事实表将包含诸如 账户余额情况表 FK 账户ID FK 日期ID Balance 显然你有一个账户维度表 and a 日期维度表 所以现在我们可以轻松地过滤帐户或日期 或
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • C# 将 IntPtr 转换为 int

    我正在动态调用 Windows API 我在网上找到了一些可以做到这一点的代码 并且我对它非常感兴趣 至少可以说 这个想法本身就很出色 但是 我似乎无法让它适用于我的代码 动态调用的参数是类型string string int 我想使用 A
  • 用更轻的解决方案替换完整的 ORM(JPA/Hibernate):推荐的加载/保存模式?

    我正在开发一个新的 Java Web 应用程序 并且正在探索保存数据的新方法 对我来说是新方法 我主要有 JPA 和 Hibernate 的经验 但是 除了简单的情况之外 我认为这种完整的 ORM 可能会变得相当复杂 另外 我不太喜欢和他们
  • PESSIMISTIC_WRITE 是否锁定整个表?

    只是为了确保我正确理解事情是如何运作的 If I do em lock employee LockModeType PESSIMISTIC WRITE 它会仅阻止该实体吗 employee 或整个表Employees 如果重要的话 我正在谈
  • 如何将表中不存在但原始SQL中存在的实体字段设置为别名?

    假设我们有一个这样的查询 SELECT CUSTOM EXPRESSION as virtualfield FROM users 用户的实体本身具有 虚拟字段 但映射注释没有 因为表没有该字段 假设它作为原始 SQL 执行 我们如何使用上面
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 计算运行总计时出错(之前期间的累计)

    我有一张桌子 我们称之为My Table有一个Created日期时间列 在 SQL Server 中 我试图提取一个报告 该报告显示历史上有多少行My Table按月在特定时间 现在我知道我可以显示有多少added每个月 SELECT YE
  • 执行带有 EXCEPTION 的 PostgreSQL 查询会导致两条不同的错误消息

    我有一个 PostgreSQL 查询 其中包含事务和列重复时的异常 BEGIN ALTER TABLE public cars ADD COLUMN top speed text EXCEPTION WHEN duplicate colum
  • 比较两个 postgres 转储文件

    如何比较 postgres 转储文件 我有两个转储文件 dump1 和 dump2 我想比较这两个转储文件 任何帮助将不胜感激 谢谢 如果使用 Windows 则可以使用 Beyond Compare 如果使用 linux fedora 则
  • 使用间隔阈值对不同的连续时间戳记录进行分组

    我有一系列间歇性间隔的带有时间戳的 GPS 坐标 我正在使用 PostGIS 将它们渲染到地图画布上 为了渲染它们 需要使用 PostGIS 中的 ST MakeLine 聚合函数将点聚合成线 从而在地图上留下 GPS 数据丢失的间隙 数据
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • SQL - != 'NULL' 的解释

    我的SSMS代码如下 Select top 50 From FilteredContact Where statuscode 1 and emailaddress1 NULL and telephone1 NULL and address1

随机推荐

  • 如何使用 PHP GD 库向图像添加文本

    我在 image creator 中有图像创建代码 图像输出的文件是 image php 并具有以下代码
  • 在 github 存储库中搜索定义给定函数的文件

    我想搜索 github 上的公共存储库以查找软件定义给定函数的位置 使用高级搜索似乎应该很简单 不确定我是否不理解过滤器或者函数是否未定义 例如 假设我想找到 Hadley 的位置facet wrap函数在 ggplot2 存储库中定义 它
  • 防止 WinForm AcceptButton 处理 Return 键

    我有一个带有按钮的表单AcceptButton属性 以便在用户按 Return 键时发生逻辑并关闭表单 在该表单上 我显示一个动态创建的TextBox当用户双击某个区域时出现 然后当用户按回车键时隐藏 当用户按下 Return 键时 如何防
  • 在 OS X 上创建类似窗口的菜单

    我想创建一个相同类型的托盘菜单 例如这个应用程序 因为它在使用node webkit nw js的应用程序列表中 所以我认为这是可能的 我浏览了所有文档 但找不到任何有关如何实现这一目标的信息 谷歌搜索也没有什么结果 也许你们中的一个人以前
  • 无法实例化类:org.apache.naming.java.javaURLContextFactory

    我正在研究 Junit 测试文件 该文件加载 SQL 文件并将其加载到 Oracle 中 import java io BufferedReader import java io File import java io FileReader
  • 嵌套点击处理程序有什么不好吗?

    有人向我提到过这一点 但我从未找到任何文件来支持这一说法 在应用程序中嵌套单击处理程序是否不好 例如 div on click function Do things p on click function Do things 如果这是不好的
  • 使用 Javascript 设置日期时间格式

    我有一个日期 时间字符串 例如2012 01 13 04 37 20但我想将其转换为dd mm yyyy hh mm 我怎样才能做到这一点 我正在使用以下代码 但它抛出异常 var now 2012 01 13 04 37 20 var d
  • Regex 使用 C# 将 Markdown 内联链接转换为 HTML 链接

    我正在用 C 编写一个非常基本的 Markdown 到 HTML 转换器 我设法编写正则表达式来转换粗体和斜体文本 但我正在努力想出一段正则表达式 它可以将 markdown 链接转换为 html 中的链接标签 例如 This is a l
  • JavaScript 文化敏感的货币格式

    如何在 JavaScript 中以文化意识的方式格式化货币相关数据 所以我知道这是一个老问题 但如果其他人出现寻找类似的答案 在现代 JavaScript 中你可以使用 new Intl NumberFormat de DE style c
  • 编写自定义异常类需要考虑哪些因素?

    什么时候自定义异常类最有价值 是否存在应该或不应该使用它们的情况 有什么好处 相关问题 抛出异常的性能注意事项 您是否为特定问题编写例外情况或一般例外情况 要问自己的问题 谁会抓住它 如果没有人 那么您实际上并不需要自定义异常 你会把它扔到
  • 比较真假混淆

    我对测试分配为 False True 的值有些困惑 要检查真实值 我们可以简单地 a True if a 假的怎么样 a False if a lt or should it be if a False or if not a 来自Pyth
  • 确定 iCloud 键值存储的可用性

    我正在开发使用 iCloud Key Value 存储的 OSX 10 8 应用程序 确实如此not使用文档存储 我想确定 iCloud 键值存储是否可供用户使用 我试图使用云 BOOL isCloudAvailable id curren
  • 在 EOF 之前的任何地方都找不到字符串终止符“str”

    为什么我会收到此错误 use strict use warnings my str lt
  • EpiServer - 以编程方式将块添加到内容区域

    我有一个内容区域 其中有一些块 这些块的某些属性必须使用 SQL 查询中的数据进行初始化 因此在控制器中我有这样的内容 foreach ObjectType item in MyList BlockData currentObject ne
  • 在 cfquery 中使用 cachedwithin 属性

    当您在 cfquery 中使用 cachedwithin 属性时 它如何将查询存储在内存中 它是否仅按您分配给查询的名称存储它 例如 如果在我的索引页面上我缓存一个查询一个小时并将其命名为 getPeople 则不同页面 或同一页面 上具有
  • Inno Setup - 正确使用[类型]、[组件]和[任务]

    我正在编写一个脚本 要求用户选择要安装应用程序的哪些部分 仅应用程序 仅数据库引擎 仅数据或这些的任意组合 我知道我应该使用 Components 部分来定义这些 但我对类型 组件和任务之间的相互作用感到困惑 首先 我认为 Tasks 用于
  • 使用stretchableImageWithLeftCapWidth调整图像大小

    我正在尝试使用stretchableImageWithLeftCapWidth调整图像大小 它在模拟器上工作 但在设备上 出现垂直的绿色条 我尝试使用 imageNamed initWithContentsOfFile 和 image Wi
  • 由于字典太大而导致 System.OutOfMemoryException

    我在字典中保存了一个带有值的大缓存IEnumerable
  • C 中的 const 限定符和 C++ 中的 const 限定符有什么区别?

    我找到了一个comment用户的R C 和 C 不是同一种语言 特别是 Cconst与C 无关const 我知道 两者之间的一个区别constC 中的限定符和constC 中的限定符是其默认链接 在命名空间范围内声明的对象constC 中的
  • 具有从列派生的动态表名称的左连接

    我是 PostgreSQL 的新手 我想知道是否可以使用number从表tbc作为左连接中表名的一部分 pa number 例如 如果数字是 456887 我想要与表 pa456887 进行左连接 像这样的东西 SELECT tdc cpa