从1个表中选择2个项目的SQL查询

时间:2018-10-08 14:18:25

标签: sql

我有2个这样的表节点和边

NodeID | Node
--------------------
1      | That
2      | Means
3      | a
4      | SIMM

边桌:

source | target | weight | type 
---------------------------
1      | 2      | 2      | undirected
1      | 3      | 1      | undirected
3      | 4      | 1      | undirected

我试图通过此查询选择来源和目标的名称,但这不起作用

SELECT N1, N2
FROM NODE,
     EDGE
WHERE EDGE.SOURCE = NODES.NODE_ID AS N1
  AND EDGE.TARGET = NODES.NODE_ID AS N2

我想要这样的输出

That means
That a

我该怎么办?

4 个答案:

答案 0 :(得分:0)

这将为您提供输出(两次加入Node。.一次用于source,一次用于target

SELECT n1.node, n2.node
FROM 
    node n1
    INNER JOIN edge e ON n1.nodeid = e.source
    INNER JOIN node n2 ON e.target = n2.nodeid
WHERE n1.nodeid = 1

如果您需要遍历比这更深的节点/边缘,您可能会发现自己陷入了递归CTE(如果数据库支持的话)中。

原始SQL中的一些问题:

  1. 您尝试在WHERE子句WHERE EDGE.SOURCE = NODES.NODE_ID AS N1中使用别名...。这是没有道理的。在上面的查询中,我将node表别名为N1N2。这是(和SELECT子句)发生混淆的地方。您不能随便推别名。

  2. 您说SELECT时会尝试在SELECT N1, N2中使用烧录别名。由于您唯一可以为列加上别名的位置是在SELECT中(并且您尚未这样做),因此将无法使用。如果已经在SELECT中定义了表别名,则可以在FROM子句中引用表别名,就像我在上面的查询中所做的那样。但是,您仍然必须引用别名中的列。

答案 1 :(得分:0)

尝试以下操作:

SELECT SN.Node, TN.Node
FROM EDGE AS E
JOIN NODE AS SN
ON SN.NODE_ID = E.SOURCE
JOIN NODE AS TN
ON TN.NODE_ID = E.TARGET

要显示源信息和目标信息,您需要加入NODE 2次。

答案 2 :(得分:0)

您可以将每个EDGE字段连接到特定的NODE表,如下所示:

SELECT n1.NODE, N2.NODE
  FROM NODE n1,
       NODE n2,
       EDGE e
  WHERE e.SOURCE = n1.NODE_ID 
    AND e.TARGET = n2.NODE_ID

答案 3 :(得分:0)

With CTE as (
     SELECT * NODE 
)
SELECT c.Node N1,cc.Node N2 from Edge
  left join CTE c on Edges.source1=c.NodeID
  Left Join CTE cc on Edges.target1=cc.NodeID