Sql 如何合并和显示多个表中的数据

Sql 如何合并和显示多个表中的数据,sql,database,postgresql,optimization,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查询这些行。有没有更快的办法

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

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

A1

B1
B2
B3

C1

D1
D2
D3
D4
然而,由于B和D中的一些要求我连接到许多表,并且我有上万条记录,所以我不想为每个id发送四个复杂的查询。我需要预构建数据——创建一个临时表,其中包含最终的a、B、C、D数据,然后直接按id查询这些行。有没有更快的办法?我曾考虑过使用联合,但我的行并不都具有相同类型的列(例如,对于类型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代码

就像注释中的“考虑我”和“Gordon Linoff”一样,我将使用所有表中的所有字段创建一个查询,并将它们合并。对于某些表的独占字段,我在查询其他表时会将其声明为“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
您还可以返回所有表的所有字段,并为每个返回的字段添加前缀,以便知道它来自哪个表

例如:

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作为参数。这也可以通过视图的形式实现

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

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


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

用代码展示您的方法。另外,您使用哪种数据库管理系统?在解决此问题时,我怀疑您对
mysql
sqlserver
postgresql
有问题。我使用postgres,但具体的DBMS与方法无关。如果我理解正确,您可以查看
完全连接
,或者使用
UNION
为没有列的查询生成
NULL
值如果行有不同的列,然后,您需要四个查询,或者在每个子查询中为“额外”列放置占位符?通过这种方式,您可以从显示查询中抽象查询逻辑,因此每次数据提取都不会非常复杂。通过视图,您还可以维护一个小型虚拟数据集市,其中包含您希望查看的信息,这些信息可能对未来的数据提取有所帮助。谢谢,我将浓缩为一个查询。我的另一个顾虑是以正确的方式交错数据,但我想我可以通过ORDER BY来做到这一点。