2

这是我的表的(事件)内容。eventID 是“主键”,parentID 是引用事件(eventsID)的“外键”

自引用表:

    eventID eventName parentID appFK
    1 evt1 空 2
    2 evt2 1 1
    3 evt3 1 1
    4 evt4 空 3
    5 evt5 8 3
    6 evt6 空 4
    7 evt7 空 1
    8 evt8 空 1

和另一个像这样的表格内容(应用程序):

    
    appID 应用名称
    1 个应用程序1      
    2 应用程序2      
    3 应用程序3      
    4 应用程序4

我想使用给定的 appID 获取所有作为父母的 eventID。如果一个孩子有给定的 appID,我想得到他的 parentID 而不是他自己。所以结果将是这样的 appID = 1 :

    eventID eventName ParentID appFK
    1 evt1 null 2 // 父事件有 appID = 1 的子事件
    7 evt7 null 1 // 没有子节点且 appID = 1 的事件
    8 evt8 null 1 // 父事件 appID = 1 并且有一个子事件

我在这里尝试了很多示例并阅读了很多解决方案,但我没有发现这样的问题。你能帮我写出正确的 SQL 吗?

谢谢。

4

1 回答 1

3

尝试这个:

SELECT DISTINCT COALESCE(e2.eventID, e1.eventID), 
       COALESCE(e2.eventName, e1.eventName),
       COALESCE(e2.appFK, e1.appFK)
FROM events AS  e1
LEFT JOIN events AS e2 ON e1.parentID = e2.eventID AND e1.appFK = 1
WHERE (e1.appFK = 1 AND e1.parentID IS NULL) OR (e2.eventID IS NOT NULL)

LEFT JOIN获取appID = 1 ( ) 的子项的父记录( )。e1.parentID = e2.eventIDe1.appFK = 1

WHERE子句选择具有( )的子项相关的根记录appID = 1 和根记录。appID = 1e2.eventID IS NOT NULL

演示在这里

于 2016-03-18T16:00:06.877 回答