根据某些情况,仅将表与同一表连接一次

时间:2015-08-14 14:13:08

标签: sql-server

我想将下表中的文档与基于stdout的父文档一起加入。我想只与最适合的父母一起加入文件一次。

以下是选择最佳父母的规则:

  1. 父文档属于同一文化
  2. 父文档属于默认区域(在本例中为en-US)
  3. 选择ID最低的父文档
  4. Document table

    根据上述规则,这应该是输出

    expected output

    但是我的查询

    NodeID = NodeParentID

    我得到了所有的组合

    My result

    以下是架构创建脚本:

    SELECT *
    FROM Document as Child
    LEFT JOIN Document AS Parent 
    ON 
        CASE 
        WHEN Child.Culture = Parent.Culture THEN Parent.NodeID
        WHEN Parent.Culture = 'en-US' THEN Parent.NodeID
        ELSE (SELECT MIN(NodeID) FROM Document WHERE NodeID = Parent.NodeID)
        END = Child.NodeParentID
    WHERE Child.AliasPath like '/Home/%'
    AND Child.Level = 2
    Order by Child.ID, Child.NodeID
    

1 个答案:

答案 0 :(得分:1)

您可以使用外部申请来查找父级的最佳匹配。我在外部应用中编写子查询以获取节点的所有父节点,然后按顺序应用规则,以便找到最佳匹配。通过使用OUTER APPLY,无论是否找到父母,您都将返回节点。如果您希望排除没有父母的孩子(您的根节点),您可以更改为CROSS APPLY

SELECT *
FROM Document C
    OUTER APPLY (
        SELECT TOP 1 *
        FROM Document
        WHERE C.NodeParentID = NodeID
        ORDER BY
            CASE WHEN Culture = C.Culture THEN 0 ELSE 1 END,
            CASE WHEN Culture = 'en-US' THEN 0 ELSE 1 END,
            NodeId
    ) P
WHERE C.AliasPath like '/Home/%'
AND C.Level = 2

这会产生您想要的输出。