如何根据字段值加入变量表?

时间:2016-02-25 06:51:17

标签: sql postgresql

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

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

事件的值可以是一百个不同的值之一。

2 个答案:

答案 0 :(得分:1)

可能你可以使用继承:PostgreSQL 9.5.1 Documentation: Inheritance

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

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中)。

答案 1 :(得分:0)

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

如果你想避免在你的应用程序代码中这样做,你需要使用PL / pgSQL的EXECUTE,这意味着你必须创建一个函数来做它

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

CREATE FUNCTION EventTable(TableName TEXT, id INT) RETURNS TABLE (x INT, y INT) AS
$$
BEGIN
  RETURN QUERY EXECUTE 'SELECT x, y FROM ' || TableName || ' WHERE id = $1' USING id;
END
$$
LANGUAGE plpgsql;

SELECT id, event, e.*
FROM t
LEFT JOIN EventTable(event, id) e ON true;

SQLFiddle example