10

I'm very excited by several of the more recently-added Postgres features, such as foreign data wrappers. I'm not aware of any other RDBMS having this feature, but before I try to make the case to my main client that they should begin preferring Postgres over their current cocktail of RDBMSs, and include in my case that no other database can do this, I'd like to verify that.

I've been unable to find evidence of any other database supporting SQL/MED, and things like this short note stating that Oracle does not support SQL/MED.

The main thing that gives me doubt is a statement on http://wiki.postgresql.org/wiki/SQL/MED:

SQL/MED is Management of External Data, a part of the SQL standard that deals with how a database management system can integrate data stored outside the database.

If FDWs are based on SQL/MED, and SQL/MED is an open standard, then it seems likely that other RDBMSs have implemented it too.

TL;DR:

Does any database besides Postgres support SQL/MED?

4

2 回答 2

11
  • IBM DB2声称符合 SQL/MED(包括完整的 FDW API);
  • MySQL的 FEDERATED 存储引擎可以连接到另一个 MySQL 数据库,但不能连接到其他 RDBMS
  • MariaDB的 CONNECT 引擎允许访问各种文件格式(CSV、XML、Excel 等),可以访问“任何”ODBC 数据源(Oracle、DB2、SQLServer 等),并且可以访问存储引擎 MyIsam 和 InnoDB 上的数据.
  • 法拉戈也有一些。
  • PostgreSQL实现了它的一部分(特别是它没有实现常规映射,并且有一个简化的 FDW API)。它自 PG 9.1 起可用作可读,自 9.3 起可写,在此之前有DBI-Link

PostgreSQL 社区有很多不错的FDW,例如 noSQL FDW(couchdb_fdw、mongo_fdw、redis_fdw)、Multicorn(用于使用 Python 输出而不是 C 本身作为包装器)或坚果PGStrom(它使用 GPU 进行某些操作!)

于 2014-05-05T04:11:18.813 回答
3

SQL Server 具有Linked Servers( http://technet.microsoft.com/en-us/library/ms188279.aspx ) 的概念,它允许您连接到外部数据源(Oracle、其他 SQL 实例、Active Directory、文件系统数据)通过索引服务提供程序等),如果您确实需要,您可以创建自己Providers的供 SQL Server 链接服务器使用的。

SQL Server 中的另一个选项是CLR,您可以在其中编写代码以根据需要从 Web 服务或其他数据源检索数据。

虽然这在技术上可能不是“SQL/MED”,但它似乎完成了同样的事情。

使用连接到 4 部分链接服务器查询的本地表的分布式查询。我认为remotetable在整个表被拉到本地之后可能不会应用过滤器(文档对此很模糊,我发现文章意见不一致):

SELECT * 
FROM LocalDB.dbo.table t
INNER JOIN LinkedServer1.RemoteDB.dbo.remotetable r on t.val = r.val
WHERE r.val < 1000
;

使用 OpenQuery,remotetable过滤器将应用于远程服务器,只要将过滤器传递给 OpenQuery 的第二个参数:

SELECT * 
FROM LocalDB.dbo.table t
INNER JOIN OPENQUERY(LinkedServer1, 'SELECT * FROM RemoteDB.dbo.remotetable r WHERE r.val < 1000') r on t.val = r.val
于 2014-05-01T16:50:32.377 回答