左联接与从列派生的动态表名称

Lubos K.

我是PostgreSQL的新手,我想知道是否可以在左连接中将numberfrom tabletbc用作表名的一部分'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;

呼叫:

SELECT * FROM foo(456887)

通常,您可以使用format ( %I )清理表名,以避免SQL注入。仅使用integer动态输入就没有必要了。此相关答案中的更多详细信息和链接:
在触发器函数中使用动态表名进行插入

资料模型

数据模型可能有充分的理由。例如分区/分片或单独的特权...
如果没有足够的理由,请考虑将具有相同模式的多个表合并到一个表中并添加numberas列。这样就不需要动态SQL。

考虑继承然后,您可以添加条件tableoid以仅从给定的子表中检索行:

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

但是要注意继承的限制。相关答案:

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

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

仅适用于几张桌子

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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

左联接表名称动态形成主查询

来自分类Dev

表别名+左联接

来自分类Dev

在动态表名称上进行表联接

来自分类Dev

在动态表名称上进行表联接

来自分类Dev

当列具有相同名称时如何左联接

来自分类Dev

Linq中的左联接表

来自分类Dev

左联接和表计数

来自分类Dev

当联接表的前1列与主表的列匹配时,使用“左联接”的SQL查询返回结果

来自分类Dev

SQL内部联接到左联接表

来自分类Dev

左联接,不使用3个表的左联接

来自分类Dev

左联接父表上的多个表,并从父表中减去一列

来自分类Dev

左联接表A取决于表B

来自分类Dev

光滑:动态排序通过查询与左联接

来自分类Dev

mysql查询在循环中使用具有相同名称的列的左联接

来自分类Dev

MySQL从表B中左联接多行

来自分类Dev

使用左联接表编辑查询

来自分类Dev

在“ FROM”部分的多个表上左联接

来自分类Dev

左联接到现有表

来自分类Dev

左联接表的总和-引起问题

来自分类Dev

实体框架左联接多个表失败

来自分类Dev

使用数据表左联接

来自分类Dev

SQL:左联接与三个表

来自分类Dev

左联接不同的表和计数

来自分类Dev

MySQL左联接表不在日期之间

来自分类Dev

Oracle SQL添加左联接相同的表

来自分类Dev

如何用左联接创建新表

来自分类Dev

选择左联接表的使用和条件

来自分类Dev

SQL Server左联接与3个表

来自分类Dev

交叉表查询-根据相关表动态派生列标题