Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何基于字段值连接到变量表?_Sql_Postgresql - Fatal编程技术网

Sql 如何基于字段值连接到变量表?

Sql 如何基于字段值连接到变量表?,sql,postgresql,Sql,Postgresql,我有一个名为tracks的表,其中包含基本数据。重要的部分是该表有一个名为id和event的列。事件字段的值是另一个表的名称。该表有一个匹配的id,其中包含许多关于跟踪内容的详细信息。有可能这样做吗 SELECT id, event, e.* FROM tracks t LEFT JOIN $event e ON t.id = e.id event的值可以是一百个不同值中的一个。在一个简单的SQL查询中不能有变量表名;无论如何,您需要构建并执行一个动态查询字符串 如果希望避免在应用程序代码中

我有一个名为tracks的表,其中包含基本数据。重要的部分是该表有一个名为id和event的列。事件字段的值是另一个表的名称。该表有一个匹配的id,其中包含许多关于跟踪内容的详细信息。有可能这样做吗

SELECT id, event, e.*
FROM tracks t
LEFT JOIN $event e ON t.id = e.id 

event的值可以是一百个不同值中的一个。

在一个简单的SQL查询中不能有变量表名;无论如何,您需要构建并执行一个动态查询字符串

如果希望避免在应用程序代码中执行此操作,则需要使用PL/pgSQL,这意味着您必须创建一个函数来执行此操作

如果事件表中的公共字段是例如
x INT,y INT
,那么这应该可以工作(尽管可能不是特别有效):


您可能可以使用继承:

在这种情况下,您可能有空的父表:

CREATE TABLE events(
    id SERIAL PRIMARY KEY, 
    event_type INTEGER,
    ...
);
还有一堆孩子的桌子

CREATE TABLE events_1(event_type INTEGER DEFAULT 1 CHECK(event_type = 1)) INHERITS (events);
CREATE TABLE events_2(event_type INTEGER DEFAULT 2 CHECK(event_type = 2)) INHERITS (events);
...
然后,您将能够使用以下查询:

SELECT t.id, t.event_type, e.*
FROM tracks t
JOIN events e on t.id = e.id AND t.event_type = e.event_type;
但若要从父表中请求所有列,则必须将它们添加到父表中


UPD:不能在纯sql中使用变量作为表名。唯一的方法是动态代码生成(例如在plpgsql中)。

您需要在编程语言中动态连接查询?。我打算得到过去60天的所有曲目,然后从特定事件表中获取详细信息。我没有创建结构并试图避免执行循环查询。所有特定表是否都具有相同的结构(或者您是否可以从该特定表中获取一行json或其他内容?)。有很多方法,但循环可能更快。它们有十几个共享属性。有些表有一个value和revenue列,如果它们是空的或不存在,那么这些就是我想要得到的。您应该能够通过使用:
JOIN events e on t.id=e.id和t.event::regclass=e.tableoid
SELECT t.id, t.event_type, e.*
FROM tracks t
JOIN events e on t.id = e.id AND t.event_type = e.event_type;