我看过很多关于 multiple JOIN 的帖子,但对我的情况没有帮助。
假设我有三个表和两个交叉引用表。这与其他帖子的不同之处在于,他们有多个表格,但 FROM 中有一个交叉引用表格。
表 1 -> 交叉引用 1 <- 表 2 -> 交叉引用 2 <- 表 3
我的 Postgresql 版本是:9.0.11,我正在使用 W7 64 位。
我的要求是以下内容:
Select [columns] from cross-ref1, cross-ref2
INNER JOIN table1 ON table1.id_table1=cross-ref1.ref_id_table1
INNER JOIN table2 ON table2.id=cross-ref1.ref_id_table2
INNER JOIN table2 On table2.id_table2=cross-ref2.ref_id_table2
INNER JOIN table3 ON table3.id_table3=cross-ref2.ref_id_table3
错误信息是:“多次指定表名。”
你能解释一下错误吗?
谢谢
最佳答案
交叉引用表需要为引用的每一侧单独的列。只有一列的外部参照表没有意义,因为它只能引用每一侧具有相同 ID 的行。
典型的设置是:
CREATE TABLE a (
id integer primary key,
avalue text not null
);
CREATE TABLE b (
id integer primary key,
bvalue text not null
);
CREATE TABLE ab (
a_id integer references a(id),
b_id integer references b(id),
PRIMARY KEY(a_id, b_id)
);
给定样本数据:
INSERT INTO a(id, avalue) VALUES
(1, 'a1'), (2, 'a2'), (3, 'a3'), (4, 'a4');
INSERT INTO b(id, bvalue) VALUES
(41, 'b1'), (42, 'b2'), (43, 'b3');
INSERT INTO ab(a_id, b_id) VALUES
(1, 41), (1, 42), (2, 43);
你会找到 a
和 b
的配对:
SELECT avalue, bvalue
FROM a
INNER JOIN ab ON (a.id = ab.a_id)
INNER JOIN b ON (b.id = ab.b_id);
这里的关键是您在 a
端加入 ab.a_id
,在 ab.b_id
加入 b
端。在这里观看演示:http://sqlfiddle.com/#!12/3228a/1
这几乎是“多对多表关系 101”,因此可能值得对介绍性 SQL 和关系数据库教程和文档进行更多研究。
关于PostgreSQL : How to join with multiple cross-reference table?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17874873/