t-sql至少有一个公共记录条件

t-sql至少有一个公共记录条件,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,我有两个表region和RegionNodes,试图找到正确的t-sql查询 区域: 另一个表RegionNodes 在RegionNodes中,所有记录都必须有一个记录RegionId=-1和一个或多个其他区域。目标是,节点应该具有全局和另一个区域。因此,从上面的RegionNodes表ID1,2,3,4,5,6是正确的,但7和8是不正确的;因为他们只有全球区域,没有任何其他区域 如何找到只有全局区域而没有任何其他区域的条目,以便清理数据并检查条件?请帮忙。非常感谢专家的帮助。在您的案例中,最

我有两个表region和RegionNodes,试图找到正确的t-sql查询

区域:

另一个表RegionNodes

在RegionNodes中,所有记录都必须有一个记录RegionId=-1和一个或多个其他区域。目标是,节点应该具有全局和另一个区域。因此,从上面的RegionNodes表ID1,2,3,4,5,6是正确的,但7和8是不正确的;因为他们只有全球区域,没有任何其他区域


如何找到只有全局区域而没有任何其他区域的条目,以便清理数据并检查条件?请帮忙。非常感谢专家的帮助。

在您的案例中,最简单的方法可能就是找到出现一次的节点:

SELECT NodeId
FROM RegionNodes
WHERE RegionId= -1 AND NodeId NOT IN (SELECT NodeId
                                  FROM RegionNodes
                                  WHERE RegionId <> -1 )
select NodeId
from RegionNodes rn
group by NodeId
having count(*) < 2;

这将返回没有一个全局区域和一个非全局区域的节点。

如果您只想返回只有全局条目的节点的节点ID,则上述解决方案将起作用。如果要返回这些条目的完整记录(id、nodeId和regionId),则以下是替代解决方案:

select n.*
from dbo.RegionNodes as n
where n.regionId=-1
    and not exists
    (
        select 1
        from dbo.RegionNodes as n2
        where n2.nodeId=n.nodeId
            and n2.regionId<>n.regionId
    )
这应该起作用:

select NodeId from RegionNodes
group by NodeId
having not(min(RegionId) = -1 and max(RegionId) >=0)

你能用你写的数据设置一个你想要的输出的例子吗?我不太明白你想要什么。我相信在你的第一句话中应该有count*<2,因为可能有-1,2,3。但是也可能有1,2,3,这是不正确的,因为应该有-1,并且至少还有一行不是-1。@GiorgiNakeuri。我更改了查询以反映允许多个区域。谢谢您的回答。我从group by开始,计数小于2,就像你的第一个查询一样,但它不会告诉我它是否至少有1条RegionId=-1的记录,这就是我遇到的问题。第二个问题很有效。非常感谢。谢谢你的回答。
select NodeId
from RegionNodes rn
group by NodeId
having sum(case when RegionId = -1 then 1 else 0 end) <> 1 or
       sum(case when RegionId <> -1 then 1 else 0 end) = 0;
select n.*
from dbo.RegionNodes as n
where n.regionId=-1
    and not exists
    (
        select 1
        from dbo.RegionNodes as n2
        where n2.nodeId=n.nodeId
            and n2.regionId<>n.regionId
    )
select NodeId from RegionNodes
group by NodeId
having not(min(RegionId) = -1 and max(RegionId) >=0)