我有一張名爲跟蹤與基本數據的表。重要的部分是這個表有一個名爲id和event的列。事件字段的值是另一個表的名稱。該表具有與關於所跟蹤內容的許多細節相匹配的ID。是否有可能做這樣的事情?如何根據字段值加入變量表?
SELECT id, event, e.*
FROM tracks t
LEFT JOIN $event e ON t.id = e.id
事件的值可能是一百個不同的值之一。
我有一張名爲跟蹤與基本數據的表。重要的部分是這個表有一個名爲id和event的列。事件字段的值是另一個表的名稱。該表具有與關於所跟蹤內容的許多細節相匹配的ID。是否有可能做這樣的事情?如何根據字段值加入變量表?
SELECT id, event, e.*
FROM tracks t
LEFT JOIN $event e ON t.id = e.id
事件的值可能是一百個不同的值之一。
在簡單的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;
也許你可以使用繼承: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:你不能在pure sql中使用變量作爲表名。唯一的方法是動態生成代碼(例如在plpgsql中)。
你應該能夠通過使用['tableoid'](http://www.postgresql.org/docs/current/static/ddl-system-columns.html):'JOIN事件來避免額外的列。 id = e.id AND t.event :: regclass = e.tableoid' –
你需要在你的編程語言中動態地連接你的查詢 –
無論如何圍繞?我打算在過去60天內獲得所有曲目,然後從特定活動表中獲取詳細信息。我沒有創建結構並試圖避免循環查詢。 –
是否所有的特定表都具有相同的結構(或者您可以將該特定表中的某行作爲json或其他東西?)。有辦法,但循環可能會更快。 –