将表连接到自身并将结果保存在sql

时间:2017-06-06 16:45:33

标签: sql postgresql

我是SQL的新手,我现在已经尝试过一段时间,但它并不适合我。 我有一个包含2列的表格,例如:

TBL

source | destination
  0    |     1
  1    |     2
  3    |     7
  9    |     10

我试图加入自己的表,其中存在一个与源相等的目的地,将它的2列重命名为S0,S1,仅从目标列中取出右边连接表并将其重命名为S2,然后将结果保存在视图中。

在示例表上,运行查询应具有以下视图:

S0   | S1  |  S2
0    | 1   |  2

我尝试过这样的事情:

CREATE VIEW V1 AS
SELECT tbl.source as S0,tbl.destination as S1 FROM tbl
JOIN
SELECT Hops.destination as S2 FROM Hops
ON tbl.S1=Hops.source

但它没有用。我很感激任何帮助:)

1 个答案:

答案 0 :(得分:0)

我认为首先要了解的是联接的工作原理。通常,当您从连接在一起的2个表中进行选择时,您将只有一个select语句。像这样:

SELECT *
FROM Table1 AS T1
INNER JOIN Table2 AS T2
  ON T1.Col1=T2.Col1

请注意,此语句中的*正在从两个表中选择每一列。您还可以将列指定为T1.*, T2.*,或者在大多数情况下更恰当地指定T1.Col1, T1.Col2, T2.Col2或类似的行。

我不知道你想要达到的具体细节,但我认为你想要这样的东西:

SELECT T1.Source AS S0, T2.Source AS S1, T2.Destination AS S2
FROM tbl AS T1
INNER JOIN tbl AS T2
  ON T1.Destination=T2.Source

或者,如果要包含Destination与任何Source不匹配的记录,您可以尝试

SELECT T1.Source AS S0, ISNULL(T2.Source, T1.Destination) AS S1, T2.Destination AS S2
FROM tbl AS T1
LEFT OUTER JOIN tbl AS T2
  ON T1.Destination=T2.Source

(编辑:实际上,我意识到SELECT子句可以简化为SELECT T1.Source AS S0, T1.Destination AS S1, T2.Destination AS S2,因为我们定义了JOIN,使T1.Destination和T2.Source相等,除非T2.Source为NULL(即没有找到了匹配记录),但是我将其留作说明在使用OUTER JOIN的两列之间使用ISNULL或COALESCE,这可能是一个有用的构造。)