SQL无法获得存在条款正常工作的位置,而仅返回具有在特定日期内为客户端类型的行



好吧,这让我发疯了,我确定解决方案会很简单,我可能会把头撞到墙上。我有一个有客户数据的查询。在某些查询中,我只希望客户在该日期范围内的某个点访问的某个日期之间,这与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不会过滤查询返回的数据。
它返回TRUEFALSE
因此,如果它返回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)

最新更新