SQL 无法使 WHERE EXISTS 子句正常工作,并且只有 return 行具有特定日期内的客户端类型
SQL Cannot get WHERE EXISTS Clause to work properly and only return rows that have a type for a client within a certain date
好吧,这让我发疯了,我相信解决方案非常简单,我可能会把头撞到墙上。我有一个查询,我有客户数据。在某些查询中,我只希望客户在某个日期范围内的某个时间点访问过该日期范围内的客户,这对应于 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
在上面,当我 运行 这个查询时,我希望它 return 来自客户 5 的两行,因为他们在任何行中的呼叫报告 ID 为 3,8 或 12日期范围,并排除 Customer 6 中的两行,因为它们在日期范围
中没有 call_report_Id 和这些类型
但是,每次我 运行 它时,它 return 都会收集该用户的所有行,而不仅仅是 WHERE 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)
it returns all rows for this user, not just the ones specified in the
WHERE EXISTS SubQuery
这个EXISTS
不过滤查询返回的数据。
它 returns TRUE
或 FALSE
。
因此,如果它 returns FALSE
您的查询
将 没有返回行
如果它 returns TRUE
所有行 条件下:
CV.User_ID = 33 AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
会被退回
它 returns 所有行,因为您没有在现有查询中进行任何过滤。
我认为最好更改此查询,因此您可以使用联接。
您没有以任何方式将子查询与外部查询连接起来。
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'
好吧,这让我发疯了,我相信解决方案非常简单,我可能会把头撞到墙上。我有一个查询,我有客户数据。在某些查询中,我只希望客户在某个日期范围内的某个时间点访问过该日期范围内的客户,这对应于 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
在上面,当我 运行 这个查询时,我希望它 return 来自客户 5 的两行,因为他们在任何行中的呼叫报告 ID 为 3,8 或 12日期范围,并排除 Customer 6 中的两行,因为它们在日期范围
中没有 call_report_Id 和这些类型但是,每次我 运行 它时,它 return 都会收集该用户的所有行,而不仅仅是 WHERE 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)
it returns all rows for this user, not just the ones specified in the WHERE EXISTS SubQuery
这个EXISTS
不过滤查询返回的数据。
它 returns TRUE
或 FALSE
。
因此,如果它 returns FALSE
您的查询
将 没有返回行
如果它 returns TRUE
所有行 条件下:
CV.User_ID = 33 AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
会被退回
它 returns 所有行,因为您没有在现有查询中进行任何过滤。
我认为最好更改此查询,因此您可以使用联接。
您没有以任何方式将子查询与外部查询连接起来。
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'