Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 根据某些情况,仅将表与同一个表连接一次_Sql Server - Fatal编程技术网

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
将下表中的文档与其父文档连接起来。我只想和最适合我的父母一起加入文档一次

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

  • 父文档处于相同的区域性中
  • 父文档处于默认区域性(在本例中为en US)
  • 选择ID最低的父文档
  • 根据上面的规则,这应该是输出

    但我的问题是

    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
    
    这将产生所需的输出