我有一个名为track的表,带有基本数据。重要的部分是该表有一个名为id和event的列。事件字段的值是另一个表的名称。该表具有匹配的ID,其中包含有关所跟踪内容的大量详细信息。有可能做这样的事吗?
SELECT id, event, e.*
FROM tracks t
LEFT JOIN $event e ON t.id = e.id
事件的值可以是一百个不同的值之一。
答案 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;