Sql server 根据某些情况,仅将表与同一个表连接一次
我想基于Sql server 根据某些情况,仅将表与同一个表连接一次,sql-server,Sql Server,我想基于NodeID=NodeParentID将下表中的文档与其父文档连接起来。我只想和最适合我的父母一起加入文档一次 以下是选择最佳父级的规则: 父文档处于相同的区域性中 父文档处于默认区域性(在本例中为en US) 选择ID最低的父文档 根据上面的规则,这应该是输出 但我的问题是 SELECT * FROM Document as Child LEFT JOIN Document AS Parent ON CASE WHEN Child.Culture = Pare
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
我知道所有的组合
以下是架构创建脚本:
CREATE TABLE Document
([ID] int, [NodeID] int, [NodeParentID] int, [Level] int, [AliasPath] varchar(49), [Culture] varchar(5));
INSERT INTO Document
([ID], [NodeID], [NodeParentID], [Level], [AliasPath], [Culture])
VALUES
(1, 1, 0, 0, '/', 'en-US'),
(2, 2, 1, 1, '/Home', 'en-US'),
(3, 3, 1, 1, '/Contact', 'en-US'),
(6, 3, 1, 1, '/Contact', 'sk-SK'),
(13, 2, 1, 1, '/Home', 'it-IT'),
(15, 2, 1, 1, '/Home', 'cs-CZ'),
(16, 2, 1, 1, '/Home', 'sk-SK'),
(4, 4, 2, 2, '/Home/English', 'en-US'),
(5, 4, 2, 2, '/Home/English', 'it-IT'),
(10, 8, 3, 2, '/Contact/Person', 'cs-CZ'),
(11, 8, 3, 2, '/Contact/Person', 'it-IT'),
(7, 5, 4, 3, '/Home/English/Slovak', 'sk-SK'),
(14, 5, 4, 3, '/Home/English/Slovak', 'en-US'),
(8, 6, 5, 4, '/Home/English/Slovak/Italian', 'it-IT'),
(9, 7, 6, 5, '/Home/English/Slovak/Italian/Czech', 'cs-CZ'),
(12, 9, 8, 3, '/Contact/Person/Slovakian', 'sk-SK');
您可以使用外部应用来查找父级的最佳匹配。我在外部应用程序中编写了子查询,以获取节点的所有父节点,然后按顺序应用规则,以便找到最佳匹配。通过使用
外部应用
,无论是否找到父节点,都将返回节点。如果要排除没有父节点的子节点(根节点),可以更改为交叉应用
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
这将产生所需的输出