我有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
我该怎么办?
答案 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中的一些问题:
您尝试在WHERE子句WHERE EDGE.SOURCE = NODES.NODE_ID AS N1
中使用别名...。这是没有道理的。在上面的查询中,我将node
表别名为N1
和N2
。这是(和SELECT子句)发生混淆的地方。您不能随便推别名。
您说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