Sql 选择一行并使用不同的ID插入它n次

Sql 选择一行并使用不同的ID插入它n次,sql,postgresql,sql-insert,cross-join,generate-series,Sql,Postgresql,Sql Insert,Cross Join,Generate Series,我试图在Postgres中找到一个脚本,它将选择表中的第一行,并将该行x多次插入到同一个表中 以下是我所拥有的: INSERT INTO campaign (select column_name from campaign) SELECT x.id from generate_series(50, 500) as x(id); 上述方法显然不起作用。只需获取正确的语法即可: 交叉连接到generate_series()会将每个选定行相乘 选择任意一行,因为问题没有定义“第一”。桌子上没有自然的

我试图在Postgres中找到一个脚本,它将选择表中的第一行,并将该行
x
多次插入到同一个表中

以下是我所拥有的:

INSERT INTO campaign (select column_name from campaign)
SELECT x.id from generate_series(50, 500) as x(id);

上述方法显然不起作用。

只需获取正确的语法即可:

交叉连接到
generate_series()
会将每个选定行相乘

选择任意一行,因为问题没有定义“第一”。桌子上没有自然的秩序。要选择某一行,请添加
orderby
和/或
WHERE

除了名为“id”的列之外,没有语法快捷方式选择所有列。您必须使用完整的行或提供所选列的列表

使用动态SQL实现自动化 要解决这个问题,请从目录表(或信息模式)构建查询字符串,并在plpgsql函数(或其他一些过程语言)中使用。仅使用。
需要博士后9.1或更高版本

CREATE OR REPLACE FUNCTION f_multiply_row(_tbl regclass
                                        , _idname text
                                        , _minid int
                                        , _maxid int)
  RETURNS void AS
$func$
BEGIN

   EXECUTE (
      SELECT format('INSERT INTO %1$s (%2$I, %3$s)
                     SELECT g.g, %3$s
                     FROM  (SELECT * FROM %1$s LIMIT 1) t
                           ,generate_series($1, $2) g(g)'
                   , _tbl
                   , _idname
                   , string_agg(quote_ident(attname), ', ')
                   )
      FROM   pg_attribute 
      WHERE  attrelid = _tbl
      AND    attname <> _idname  -- exclude id column
      AND    NOT attisdropped    -- no dropped (dead) columns
      AND    attnum > 0          -- no system columns
      )
   USING _minid, _maxid;

END
$func$ LANGUAGE plpgsql;

要点
  • 正确转义标识符以避免SQL注入。使用
    format()
    regclass
    作为表名。详情:

  • \u idname
    是要排除的列名(在您的情况下为“id”)。区分大小写

  • 使用
子句传递
中的值<
generate_series($1,$2)
中的code>$1
$2
引用这些参数(而不是函数参数)

在相关答案中提供更多解释。尝试搜索:

只需获取正确的语法即可:

交叉连接到
generate_series()
会将每个选定行相乘

选择任意一行,因为问题没有定义“第一”。桌子上没有自然的秩序。要选择某一行,请添加
orderby
和/或
WHERE

除了名为“id”的列之外,没有语法快捷方式选择所有列。您必须使用完整的行或提供所选列的列表

使用动态SQL实现自动化 要解决这个问题,请从目录表(或信息模式)构建查询字符串,并在plpgsql函数(或其他一些过程语言)中使用。仅使用。
需要博士后9.1或更高版本

CREATE OR REPLACE FUNCTION f_multiply_row(_tbl regclass
                                        , _idname text
                                        , _minid int
                                        , _maxid int)
  RETURNS void AS
$func$
BEGIN

   EXECUTE (
      SELECT format('INSERT INTO %1$s (%2$I, %3$s)
                     SELECT g.g, %3$s
                     FROM  (SELECT * FROM %1$s LIMIT 1) t
                           ,generate_series($1, $2) g(g)'
                   , _tbl
                   , _idname
                   , string_agg(quote_ident(attname), ', ')
                   )
      FROM   pg_attribute 
      WHERE  attrelid = _tbl
      AND    attname <> _idname  -- exclude id column
      AND    NOT attisdropped    -- no dropped (dead) columns
      AND    attnum > 0          -- no system columns
      )
   USING _minid, _maxid;

END
$func$ LANGUAGE plpgsql;

要点
  • 正确转义标识符以避免SQL注入。使用
    format()
    regclass
    作为表名。详情:

  • \u idname
    是要排除的列名(在您的情况下为“id”)。区分大小写

  • 使用
子句传递
中的值<
generate_series($1,$2)
中的code>$1
$2
引用这些参数(而不是函数参数)

在相关答案中提供更多解释。尝试搜索:

只需获取正确的语法即可:

交叉连接到
generate_series()
会将每个选定行相乘

选择任意一行,因为问题没有定义“第一”。桌子上没有自然的秩序。要选择某一行,请添加
orderby
和/或
WHERE

除了名为“id”的列之外,没有语法快捷方式选择所有列。您必须使用完整的行或提供所选列的列表

使用动态SQL实现自动化 要解决这个问题,请从目录表(或信息模式)构建查询字符串,并在plpgsql函数(或其他一些过程语言)中使用。仅使用。
需要博士后9.1或更高版本

CREATE OR REPLACE FUNCTION f_multiply_row(_tbl regclass
                                        , _idname text
                                        , _minid int
                                        , _maxid int)
  RETURNS void AS
$func$
BEGIN

   EXECUTE (
      SELECT format('INSERT INTO %1$s (%2$I, %3$s)
                     SELECT g.g, %3$s
                     FROM  (SELECT * FROM %1$s LIMIT 1) t
                           ,generate_series($1, $2) g(g)'
                   , _tbl
                   , _idname
                   , string_agg(quote_ident(attname), ', ')
                   )
      FROM   pg_attribute 
      WHERE  attrelid = _tbl
      AND    attname <> _idname  -- exclude id column
      AND    NOT attisdropped    -- no dropped (dead) columns
      AND    attnum > 0          -- no system columns
      )
   USING _minid, _maxid;

END
$func$ LANGUAGE plpgsql;

要点
  • 正确转义标识符以避免SQL注入。使用
    format()
    regclass
    作为表名。详情:

  • \u idname
    是要排除的列名(在您的情况下为“id”)。区分大小写

  • 使用
子句传递
中的值<
generate_series($1,$2)
中的code>$1
$2
引用这些参数(而不是函数参数)

在相关答案中提供更多解释。尝试搜索:

只需获取正确的语法即可:

交叉连接到
generate_series()
会将每个选定行相乘

选择任意一行,因为问题没有定义“第一”。桌子上没有自然的秩序。要选择某一行,请添加
orderby
和/或
WHERE

除了名为“id”的列之外,没有语法快捷方式选择所有列。您必须使用完整的行或提供所选列的列表

使用动态SQL实现自动化 要解决这个问题,请从目录表(或信息模式)构建查询字符串,并在plpgsql函数(或其他一些过程语言)中使用。仅使用。
需要博士后9.1或更高版本

CREATE OR REPLACE FUNCTION f_multiply_row(_tbl regclass
                                        , _idname text
                                        , _minid int
                                        , _maxid int)
  RETURNS void AS
$func$
BEGIN

   EXECUTE (
      SELECT format('INSERT INTO %1$s (%2$I, %3$s)
                     SELECT g.g, %3$s
                     FROM  (SELECT * FROM %1$s LIMIT 1) t
                           ,generate_series($1, $2) g(g)'
                   , _tbl
                   , _idname
                   , string_agg(quote_ident(attname), ', ')
                   )
      FROM   pg_attribute 
      WHERE  attrelid = _tbl
      AND    attname <> _idname  -- exclude id column
      AND    NOT attisdropped    -- no dropped (dead) columns
      AND    attnum > 0          -- no system columns
      )
   USING _minid, _maxid;

END
$func$ LANGUAGE plpgsql;

要点
  • 正确转义标识符以避免SQL注入。使用
    format()
    regclass
    作为表名。详情:

  • \u idname
    是要排除的列名(在您的情况下为“id”)。区分大小写

  • 使用
子句传递
中的值<
generate_series($1,$2)
中的code>$1
$2
引用这些参数(而不是函数参数)

在相关答案中提供更多解释。尝试搜索:

是否要动态选择要插入的列?请定义“第一行”。并详细说明要选择/插入的列。只是给定的
列名称
?或者整行,除了
id
?另外,像往常一样,您的Postgres版本。@ErwinBrandstetter-不一定是“第一行”,只是一个