好吧,这让我发疯,我相信这个解决方案非常简单,我可能会把头撞到墙上。我有一个查询,我有客户端数据。在某些查询中,我只希望客户在特定日期之间在该日期范围内的某个时间点访问客户端,这对应于Call_Report_ID的3,8或12.对于这些客户端,我希望它在日期内带回所有数据范围,而不仅仅是具有此客户端访问代码的行。对于没有客户访问的其他客户,我想将它们从数据中排除。
这是我一直在玩的东西,根本无法让它工作。
SELECT *
FROM CV.Data AS CV
WHERE EXISTS (SELECT *
FROM CV.Data AS CVD
WHERE CVD.Call_Report_ID IN(3,8,12)
AND CVD.User_ID = 33)
AND CV.User_ID = 33
AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
所以这是我想要的一个例子:
Cust_ID Call_Report_ID Activity_Date
5 3 10/15/2018
5 7 10/28/2018
6 9 10/21/2018
6 11 10/25/2018
在上面我运行此查询时,我希望它返回来自客户5的两行,因为它们的调用报告ID为3,8,或者在日期范围内的任何行中为12,并且从客户6中排除这两行,因为它们是没有call_report_Id与日期范围内的那些类型
但是,每次运行它时,它都会返回此用户的所有行,而不仅仅是WHERE EXISTS SubQuery中指定的行。
我在这做错了什么?
您没有以任何方式使用外部查询加入子查询。
SELECT *
FROM CV.Data AS CV
WHERE EXISTS (SELECT *
FROM CV.Data AS CVD
WHERE CVD.Call_Report_ID IN(3,8,12)
AND CVD.User_ID = 33
AND CV.Cust_ID = CVD.Cust_ID) <--
AND CV.User_ID = 33
AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
用Exist
替换in
:
SELECT *
FROM Data AS CV
WHERE Cust_ID in (SELECT Cust_ID
FROM Data AS CVD
WHERE CVD.Call_Report_ID IN(3,8,12)
AND CVD.User_ID = 33)
AND CV.User_ID = 33
AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
它返回此用户的所有行,而不仅仅是WHERE EXISTS SubQuery中指定的行
此EXISTS
不会过滤查询返回的数据。
它返回TRUE
或FALSE
。
因此,如果它返回FALSE
,则查询不会返回任何行
如果它在以下条件下返回TRUE
所有行:
CV.User_ID = 33 AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
将被退回
它返回所有行,因为您没有在exists查询中进行任何过滤。
我认为最好更改此查询,因此您将使用连接。
这个怎么样:
SELECT *
FROM CV.Data AS CV
WHERE EXISTS (SELECT *
FROM CV.Data AS CVD
WHERE CVD.Call_Report_ID IN(3,8,12)
AND CVD.User_ID = 33)
AND CV.User_ID = 33
AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
AND CV.Call_Report_ID IN(3,8,12)
如果我是你,我会想我为什么需要这个EXISTS条件,它确实不是一个直接的过滤器,但是我没有足够的信息来简单地丢弃它。
您可以将我的答案视为工作提示,但请注意为什么您需要此EXISTS条件。看起来它不需要,查询可能如下所示:
SELECT *
FROM CV.Data AS CV
WHERE CV.User_ID = 33
AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
AND CV.Call_Report_ID IN(3,8,12)