Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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,下面是我的数据集- 我想提取仅包含1的Jil_设备ID。如果它在一个组中包含除1以外的任何内容,则应忽略它 因此,结果将是900256106396。这里有一种方法可以做到这一点-因为请求的值是1,所以总和和计数应该是相同的: SELECT Jil_Equipment_ID, FROM TableName GROUP BY Jil_Equipment_ID HAVING SUM(ISNULL(Req_Rule_Id, 1)) = COUNT(ISNULL(Req_Rule_Id, 1)) 您

下面是我的数据集-

我想提取仅包含1的Jil_设备ID。如果它在一个组中包含除1以外的任何内容,则应忽略它


因此,结果将是900256106396。

这里有一种方法可以做到这一点-因为请求的值是1,所以总和和计数应该是相同的:

SELECT Jil_Equipment_ID, 
FROM TableName
GROUP BY Jil_Equipment_ID 
HAVING SUM(ISNULL(Req_Rule_Id, 1)) = COUNT(ISNULL(Req_Rule_Id, 1))

您可以在子查询中执行此操作,基本上是创建一个子查询,该子查询包含所有Jil_设备_Id,其中包含NULL或1以外的数据,然后排除这些数据

样本数据

CREATE TABLE #TestData (Jil_Equipment_Id int, Req_Rule_id int)
INSERT INTO #TestData
VALUES
(90025,NULL)
,(90025,1)
,(100295,NULL)
,(100295,2)
,(100295,3)
,(3265569,NULL)
,(3265569,1)
,(3265569,2)
,(3265569,9)
,(4091637,NULL)
,(4091637,1)
,(4091637,3)
,(6106396,NULL)
,(6106396,1)
,(6106396,1)
,(6106396,1)
实际查询

SELECT DISTINCT 
a.Jil_Equipment_Id
FROM #TestData a
LEFT JOIN (
           SELECT DISTINCT 
           Jil_Equipment_Id
           FROM #TestData
           WHERE Req_Rule_id <> 1
            AND Req_Rule_id IS NOT NULL
          ) b 
ON a.Jil_Equipment_Id = b.Jil_Equipment_Id
WHERE b.Jil_Equipment_Id IS NULL

根据数据的大小,您可能需要查看notexists操作符。我一直这样保存它,因为它对最广泛的用户来说更具可读性。

这几乎是对您的SQL需求的直译:

SELECT Jil_Equipment_ID      /* I want to pull Jil_Equipment_ID */
  FROM MyTable
 WHERE Req_Rule_ID = 1       /* which contains only 1. */
   AND NOT EXISTS (     
       SELECT 1
         FROM MyTable AS t2              /* If it contains anything */
        WHERE MyTable.Jil_Equipment_ID   /* apart from 1 in a group, */
                 = t2.Jil_Equipment_ID   /* it should be neglected. */
          AND Req_Rule_ID <> 1
       )  

它没有针对性能进行优化,但易于理解,因此可以验证其正确性。

如果每组只有一个不同的值,则最小值和最大值必须相同

SELECT Jil_Equipment_ID
FROM TableName
GROUP BY Jil_Equipment_ID 
HAVING MAX(Req_Rule_Id) = 1 
AND MIN(Req_Rule_Id) = 1 
另一种方法是将计数与最小值或最大值一起包含

SELECT Jil_Equipment_ID
FROM TableName
GROUP BY Jil_Equipment_ID 
HAVING MAX(Req_Rule_Id) = 1 
AND COUNT (DISTINCT Req_Rule_Id) = 1

这对我有用。只是检查是否有任何方案失败。谢谢你的快速回答:这似乎是最合适的答案。谢谢
SELECT Jil_Equipment_ID
FROM TableName
GROUP BY Jil_Equipment_ID 
HAVING MAX(Req_Rule_Id) = 1 
AND COUNT (DISTINCT Req_Rule_Id) = 1