【问题标题】:Multiple JOINs with same column SQL Server具有同一列 SQL Server 的多个 JOIN
【发布时间】:2016-02-26 11:19:48
【问题描述】:

我必须从GraphNodes 中选择id,而相同的id 存在于GraphEdges 的两列中,即Source_NodeTarget_Node。表结构如下:

图形节点

+---+---------+-------------------+------------+-----------+
| id | Node_ID | Node             | Node_Label | Node_Type |
+---+---------+-------------------+------------+-----------+
| 1  |  677    | Nuno Vasconcelos | Author     |    1      |
| 2  |  1359   | Peng Shi         | Author     |    1      |
| 3  |  6242   | Z. Q. Shi        | Author     |    1      |
+----+---------+------------------+------------+-----------+    

GraphEdges

+------------+------------------+-------------+------------------+------+-----------+
|Source_Node | Source_Node_Type | Target_Node | Target_Node_Type | Year | Edge_Type |
+------------+------------------+-------------+------------------+------+-----------+
| 1          |  1               |  10965      |     2            | 2005 |   1       |
| 1          |  1               |  10179      |     2            | 2007 |   1       |
| 1          |  1               |  10965      |     2            | 2007 |   1       |
+------------+------------------+-------------+------------------+------+-----------+  

我只为两个表显示了 3 行,只是为了了解表的结构。我已将查询用作:

SELECT GN.id as Node_ID, 
       COUNT(DISTINCT(CONCAT(GE.Source_Node, '-', GE.Target_Node))) 
       AS Mutual_Links -- OR Node_Degree
FROM GraphEdges GE
JOIN GraphNodes GN ON GN.id = GE.Source_Node --How to JOIN this
                  AND GN.id = GE.Target_Node --How to JOIN this
WHERE (Source_Node IN (SELECT id FROM GraphNodes 
                       WHERE id BETWEEN 1 AND 510) 
                       AND Edge_Type IN (1, 2, 3))
OR (Target_Node IN (SELECT id FROM GraphNodes 
                    WHERE id BETWEEN 1 AND 510) 
                    AND Edge_Type IN (1, 2, 3))
GROUP BY GN.id

我想以如下形式输出:

+--------+-------------+
|Node_ID | Mutual_Links|
+--------+-------------+
|  1     | 31          |
|  2     | 23          |
|  3     | 12          |
| ...    | ...         |
+--------+-------------+  

问题是如何加入GraphEdgesGraphNodes,我可以从GraphNodes 获得idNode_ID 和来自GraphEdges 的COUNT DISTINCT Mutual_Links。

【问题讨论】:

    标签: sql-server join multiple-columns


    【解决方案1】:

    这样的事情怎么样

    ;with thedata ( id, MutualLinks ) 
    as (Select id, MutualLinks = count(*) from [dbo].[GraphNodes]
    inner join [dbo].[GraphEdges] on Source_node = node_id
    group by id 
    union all
    Select id, MutualLinks = count(*)   from [dbo].[GraphNodes]
    inner join [dbo].[GraphEdges] on target_node = node_id
    group by id )
    Select id, total = sum(MutualLinks)
    from thedata
    group by id
    

    【讨论】:

    • @Cameron--无法得到这个查询在做什么?
    • 它应该可以工作吗?它将源和目标视为 2 个独立的结果集,我通过 UNION 语句将它们合并在一起。我使用公用表表达式 (CTE) 将它们合并为一个查询结果集,然后我们将它们加在一起。在这种情况下,CTE 就像一个临时表。
    • @Cameron--它没有给出想要的结果
    • @Cameron--我们可以聊聊吗?我想出了另一种解决方案,形式是要讨论的查询?
    • 好的。如果您愿意,可以将您如何解决的详细信息发送给我。
    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多