好吧,这让我发疯了,我确定解决方案会很简单,我可能会把头撞到墙上。我有一个有客户数据的查询。在某些查询中,我只希望客户在该日期范围内的某个点访问的某个日期之间,这与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
但是,每次我运行它时,它都会为该用户返回所有行,而不仅仅是在subquery中指定的行。
我在这里错了什么?
用in
替换Exist
:
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'
您没有以任何方式与外部查询一起加入子查询。
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'
它为此用户返回所有行,而不仅仅是在 存在子查询
此EXISTS
不会过滤查询返回的数据。
它返回TRUE
或FALSE
。
因此,如果它返回FALSE
,则会有无行您的查询返回
如果它返回TRUE
所有行在以下条件下:
CV.User_ID = 33 AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
将返回
它返回所有行,因为您没有在存在的查询中进行任何过滤。
我认为更改此查询会更好,因此您将使用加入。
怎么样:
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)
如果我是你,我会认为为什么我需要这种状况,这确实不是一个直截了当的过滤器,但是我没有足够的信息来简单地将其丢弃。
您可以将我的答案视为工作提示,但是请考虑为什么您需要这种情况。看起来不需要,查询看起来如下:
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)