sql - 如何合并和显示来自多个表的数据

标签 sql database postgresql optimization

希望这不是太主观,但是:

我遇到一个问题,我需要根据一个 ID 从四个不同的表中查询数据。此数据具有相似但不相同的字段,需要为每个表显示这些字段。本质上,如果我有表 A、B、C 和 D,那么对于 ID N,我可能需要按以下顺序显示行:

A1

B1
B2
B3

C1

D1
D2
D3
D4

但是,由于某些 B 和 D 需要我连接到许多表,并且我有数万条记录,所以我不想为每个 ID 发送四个复杂的查询。我正在预先构建我的数据——创建一个临时表来存放每个最终的 A、B、C、D 数据,然后通过 ID 直接查询这些行。有没有更快的方法?我考虑过使用 UNION,但我的行并不都具有相同类型的列(例如,对于类型 A 的行,我可能需要显示日期,而类型 C 的行将具有整数天偏移量)。

我目前的做法:

foreach ($ids as $id) {
    $a = "SELECT * FROM a JOIN xyz (...) WHERE id = ?";
    $b = "SELECT * FROM b JOIN xyz (...) WHERE id = ?";
    $c = "SELECT * FROM c JOIN xyz (...) WHERE id = ?";
    $d = "SELECT * FROM d JOIN xyz (...) WHERE id = ?";

    print query($a, $id)->fetch();
    print query($b, $id)->fetchAll();
    print query($c, $id)->fetch();
    print query($d, $id)->fetchAll();
}

或者类似的东西

最佳答案

首先,我绝对不会查询数据库 4 次。我会尝试只查询数据库一次,即使它需要讨厌的长 sql 代码,以减少服务器和数据库之间的往返。

就像评论中的“Consider Me”和“Gordon Linoff”一样,我会创建一个查询,其中包含所有表中的所有字段,并将它们全部 UNION。对于某些表独有的字段,我会在对其他表的查询中声明它们时将其放入“null”。

例如:

select t.description as 'Description', null as 'Value'
from A t
UNION
select null as 'Description', t.value as 'Value'
from B t

您还可以返回所有表的所有字段并为每个返回的字段添加前缀,以便您知道它来自哪个表。

例如:

select t.description as 'A_Description'
from A t
UNION
select t.value as 'B_Value'
from B t

为了简单、安全和高效,我会将整个 sql 代码放在一个用户定义的函数中,该函数返回一个表,您可以从服务器端代码将其解释为记录集。该函数会将 ID 作为参数。这也可以通过 View 的形式来实现。

为了提高效率,我会在表用于连接的每个字段上放置索引,这应该会大大减少查询时间。

一般来说,我也会试着找出这个函数在一天/小时/分钟/秒内被调用了多少次。 如果经常需要函数提供的数据,那么可能需要一种完全不同的方法——重新排列整个数据库。然而,如果数据是静态或半静态的,那么缓存机制可能就足够了——以另一个数据库表、服务器端静态对象甚至客户端静态对象的形式。

您的问题没有简单的答案,因为有多种因素需要考虑。

关于sql - 如何合并和显示来自多个表的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532318/

相关文章:

php - Laravel 5 从 URL 获取 ID

android - 传递自定义对象或只是 id

mysql - 数据库中的数据编码错误(使用 CKeditor)和希腊语

python - 无法在 Maverick 上安装 psycopg2

php - sql查询中的多个条件

sql - 使用 SQL Server 存储过程将列名与变量匹配

sql - 如何在 SQL Server 中翻转一点?

Mysql 左连接、分组依据、计数和联合所有

sql - PostgreSQL:如何限制外键的存在?

postgresql - 在 PostgreSQL 中通过另一个表的值选择一列