我想将下表中的文档与基于stdout
的父文档一起加入。我想只与最适合的父母一起加入文件一次。
以下是选择最佳父母的规则:
根据上述规则,这应该是输出
但是我的查询
NodeID = NodeParentID
我得到了所有的组合
以下是架构创建脚本:
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
答案 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
这会产生您想要的输出。