【问题标题】:SQL: send query to all database availableSQL:向所有可用数据库发送查询
【发布时间】:2015-08-19 07:37:18
【问题描述】:

如何向服务器上的所有数据库发送查询?我不想输入所有数据库名称,脚本应该自动检测它们。

示例查询:

SELECT SUM(tourney_results.amt_won)-SUM((tourney_summary.amt_buyin+tourney_summary.amt_fee)) as results
FROM tourney_results
INNER JOIN tourney_summary
ON tourney_results.id_tourney=tourney_summary.id_tourney
Where id_player=(SELECT id_player FROM player WHERE player_name='Apple');

所以我想在这里实现,如果有2个数据库,第一个结果是60,第二个结果是50,我这里需要55的输出。

所有数据库都将具有相同的结构、表格等。

【问题讨论】:

  • 您使用的是哪种 dbms 产品?
  • 我正在使用 postgresql

标签: sql postgresql join


【解决方案1】:

您可以使用 plpgsql 和 db_link 来完成。首先在要连接的数据库中安装 db_link 扩展:

CREATE EXTENSION dblink;

然后使用 plpgsql 函数迭代服务器上的所有数据库并执行查询。请参阅此示例(请参阅内联 cmets)。请注意,我在函数中使用了示例查询。您必须根据实际查询调整函数:

CREATE or REPLACE FUNCTION test_dblink() RETURNS BIGINT AS
  $$
DECLARE pg_database_row record;
        query_result BIGINT;
        _dbname TEXT;
        _conn_name TEXT;
        return_value BIGINT;
BEGIN
    --initialize the final value
    return_value = 0;
    --first iterate over the records in the meta table pg_database
    FOR pg_database_row in SELECT * FROM pg_database WHERE (NOT datistemplate) AND (datallowconn) LOOP

      _dbname = pg_database_row.datname;
      --build a connection name for db_link
      _conn_name=_dbname||'myconn';
      --close the connection is already active:
      IF array_contains(dblink_get_connections(),_conn_name) THEN
        PERFORM dblink_disconnect(_conn_name);
      END IF;

      -- open the connection with the actual database name
      PERFORM dblink_connect(_dbname||'myconn', 'dbname='||_dbname);
      -- check if the table does exist in the database:
      PERFORM * FROM dblink(_conn_name,'SELECT 1 from pg_tables where tablename = ''your_table''') AS t(id int) ;
      IF FOUND THEN
        -- if the table exist, perform the query and save the result in a variable
        SELECT * FROM dblink(_conn_name,'SELECT sum(id) FROM your_table limit 1') AS t(total int) INTO query_result;
         IF query_result IS NOT NULL THEN
           return_value = return_value + query_result;
         END IF;
      END IF;
      PERFORM dblink_disconnect(_conn_name);

    END LOOP;
RETURN return_value;
END;
    $$
  LANGUAGE 'plpgsql';

执行函数

select test_dblink();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多