Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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 选择具有某些值但同时没有其他值的记录_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql 选择具有某些值但同时没有其他值的记录

Sql 选择具有某些值但同时没有其他值的记录,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,在开始之前,感谢您的帮助 我的问题是:我有一个表,例如activity_records,它有一个日期列和一个activity_id列 我只想选择那些日期,例如,在具有相同日期的任何其他记录中,activity_id值为1但不具有2的日期 我尝试过多选查询和所有这些 SELECT [date] FROM [activity_records] WHERE [activity_id] = 1 EXCEPT SELECT [date] FROM [activity_records] WHERE [act

在开始之前,感谢您的帮助

我的问题是:我有一个表,例如activity_records,它有一个日期列和一个activity_id列

我只想选择那些日期,例如,在具有相同日期的任何其他记录中,activity_id值为1但不具有2的日期

我尝试过多选查询和所有这些

SELECT [date] FROM [activity_records] WHERE [activity_id] = 1
EXCEPT
SELECT [date] FROM [activity_records] WHERE [activity_id] = 2
另请参见不存在的地方,并应用于更复杂的场景。

一种方法使用不存在:

因为您只需要日期,所以另一种选择是分组方式:

或者,最简单的是针对这种特殊情况:

select ar.date
from activity_records ar
where ar.activity_id in (1, 2)
group by ar.date
having max(ar.activity_id) = 1 ;

另一种方法是只对具有一个不同activity_id的日期进行筛选,然后通过自联接过滤那些activity_id=1的日期

SELECT DISTINCT B.DATE
FROM
(SELECT DATE, COUNT(DISTINCT ACTIVITY) AS COUNT_ACTIVITIES
FROM YOUR_TABLE
GROUP BY DATE
HAVING COUNT(DISTINCT ACTIVITY) = 1) A
INNER JOIN
YOUR_TABLE B
ON A.DATE = B.DATE
AND B.ACTIVITY_ID = 1;

一种方法不适用于:


从活动\记录中选择ar.*,其中ar.activity\ id=1,ar.date不在活动\记录中选择ar2.date,其中ar2.activity\ id=2

谢谢!这些解决方案太棒了,我要全部尝试!
select ar.date
from activity_records ar
where ar.activity_id in (1, 2)
group by ar.date
having max(ar.activity_id) = 1 ;
SELECT DISTINCT B.DATE
FROM
(SELECT DATE, COUNT(DISTINCT ACTIVITY) AS COUNT_ACTIVITIES
FROM YOUR_TABLE
GROUP BY DATE
HAVING COUNT(DISTINCT ACTIVITY) = 1) A
INNER JOIN
YOUR_TABLE B
ON A.DATE = B.DATE
AND B.ACTIVITY_ID = 1;