【问题标题】:SQL select from each table from result set of tablesSQL 从表结果集中的每个表中选择
【发布时间】:2018-04-11 17:04:17
【问题描述】:

我有一个名为 db 的数据库,其中包含具有相同架构的表,例如:

table_1、table_2、...table_n

假设每个表都有“key”和“value”列,我想选择所有 n 个表中 key = 'x'

例如,对于 key = '1' 的下表:

table_1 = {'1' => 'aaa', '2' => 'xyz'}

table_2 = {'1' => 'bbb, '3' => 'zzz'}

table_3 = {'1' => 'ccc, '3' => 'xxx'}

我希望结果集是 {'1' => 'aaa', '1' => 'bbb', '1' => 'ccc'}

我查了一下,发现我可以通过从 INFORMATION_SCHEMA 中选择它们来获取所有表,如下所示:

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('value')
    AND TABLE_SCHEMA='db';

但现在我需要找到一种方法来以这种方式(伪代码)遍历结果集:

foreach (table in tablesResultSet)
{ results += SELECT * FROM table WHERE key = 'x' }

我为粗略的伪代码道歉,但我发现这是描述问题的最佳方式。 感谢您的帮助。

【问题讨论】:

  • 跨多个表的 EAV。很棒的反模式组合:/
  • 听起来你的架构还有很多不足之处。动态确定要从哪些表中选择通常意味着糟糕的数据库设计。为什么不是所有这些记录都在一个表中。使用一个新列来描述它们属于哪个_N(前表)。然后你只需要SELECT key, value FROM my_one_table WHERE key=1;。
  • 最后,您将不得不构建一个丑陋的 UNION 查询:SELECT key, value FROM table_1 WHERE key=1 UNION ALL SELECT key, value FROM table_2 WHERE key_1 UNION ALL SELECT key, value FROM table_N WHERE key_1....
  • @JNevill 在数据库的物理级别上,拥有多个表是有意义的(电话公司使用 24 个 100GB 表比使用一个 2.4TB 表要容易得多)。但是您需要一个数据库在幕后执行所有这些操作的设置。逻辑模式应该只是一张表。
  • @AndrewLazarus 是的。我同意。一个分区的表,甚至只是正确索引的表,将是正确的解决方案。我假设 OP 没有重新设计架构的能力,但如果这是一个处于起步阶段的应用程序,那么重新设计和处理小后果将是谨慎的。

标签: sql select


【解决方案1】:

通常,具有相同架构的多个表会转到一个按日期、位置或其他标识符分区的大型逻辑表。这在归档、查询等方面效率更高。

但如果你想这样做,你应该使用支持表继承或一些等效概念的 RDBMS。您不想使用数据库的内部结构,然后必须根据结果动态构建查询。

Postgresql 10 允许您设置一个partitioning scheme,几乎所有事情都为您完成;早期版本(和 10 保留)的继承关系,让您只需做一些工作就可以做到这一点。我怀疑其他供应商也有类似的功能,如果您确实需要分区设置(无法从您的虚拟示例中确定),我会根据此功能选择 RDBMS。

【讨论】:

    猜你喜欢
    • 2020-11-22
    • 1970-01-01
    • 2014-05-28
    • 2011-01-22
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多