0

我看过很多关于多个 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

错误消息是:“表名被指定了多次。”

你能解释一下错误吗?

谢谢

4

3 回答 3

4

交叉引用表在引用的每一侧都需要单独的列。只有一列的外部参照表没有意义,因为它只能引用每一侧具有相同 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);

这里的关键是你在一边加入,ab.a_id一边aab.b_id一边b。在此处观察演示:http ://sqlfiddle.com/#!12/3228a/1

这几乎是“多对多表关系 101”,因此可能值得对介绍性 SQL 和关系数据库教程和文档进行更多研究。

于 2013-07-26T07:38:51.147 回答
1

您不能两次使用相同的表名 (table2)。在这种情况下,您需要使用别名,如 t1、t2a、t2b、...

SELECT
    ...
FROM
   table1 AS t1
   INNER JOIN table2 AS t2a
      ON t2a.id= ...
   INNER JOIN table2 AS t2b
      ON t2b.id= ...
   INNER JOIN table3 AS t3
      ON t3.id= ...
   ...

现在你可以加入任何你想要的,你想要多少次等等。

于 2013-10-01T11:06:53.460 回答
0

你必须解释你想要的结果。例如,从语法的角度来看,以下 SQL 是有效的,但从业务角度不确定:

-- this will create sample data with 5 tables
with 
crossref1(ref_id) as (VALUES (1),(2),(3)),
crossref2 (ref_id) as (VALUES (2),(3),(4)),
table1 (ref_id) as (VALUES (3),(4),(5)),
table2 (ref_id) as (VALUES (1),(2),(3)),
table3 (ref_id) as (VALUES (1),(2),(3))


-- valid SQL based on your example
select * from 
crossref1  
cross join crossref2
join table1 on table1.ref_id=crossref1.ref_id
join table2 as t2_1 on t2_1.ref_id=crossref1.ref_id
join table2 as t2_2 on t2_2.ref_id=crossref2.ref_id
join table3 on table3.ref_id=crossref2.ref_id

使用您的 SQL 有两个问题:

  • 您有两个对 table2 的引用,您必须添加别名
  • 您必须使用cross join语法而不是,

如果您想了解其with工作原理(我是如何创建示例数据的),PostgreSQL 对此有很好的文档

于 2013-07-26T07:18:45.307 回答