SQL MS Access查询的排除条件

Posted

技术标签:

【中文标题】SQL MS Access查询的排除条件【英文标题】:Exclusion Condition for SQL MS Access Query 【发布时间】:2016-11-29 02:49:02 【问题描述】:

要求:生成一个查询,该查询根据电话号码输出数据,以响应用户输入 StartDate、EndDate 和 Upper Data Threshold。

这些输入变量是查询的界限。因此,SELECT 语句相应地写在下面。

唯一需要注意的是,如果电话号码的单个记录超过了上限数据阈值,则不应输出与该违规电话号码关联的所有电话号码记录,而不管同一电话号码的其他记录没有t 违反数据阈值。以下是示例输入和预期输出:

User input Start Date: 1/15/2015
User input End Date: 11/15/2015
User input Upper Data Threshold in kB: 50

[Master] Table in Access:
Invc Date  Mobile Nbr     PktDtVol   
---------  ----------     --------   
1/15/15   647-409-8206    48kB
2/15/15   647-409-8206    33kB
3/15/15   647-409-8206    8000kB
4/15/15   647-409-8206    20kB
5/15/15   647-409-8206    10kB
6/15/15   647-409-8206    0kB
7/15/15   718-500-2311    3kB
8/15/15   718-500-2311    45kB
9/15/15   718-500-2311    25kB
10/15/15  514-300-3311    33kB
11/15/15  514-300-3311    20kB

[Temp_Table] 中的预期输出:

Invc Date  Mobile Nbr     PktDtVol    Difference in Days 
---------  ----------     --------   -------------------
7/15/15    718-500-2311    3kB             304
8/15/15    718-500-2311    45kB            304
9/15/15    718-500-2311    25kB            304
10/15/15   514-300-3311    33kB            304
11/15/15   514-300-3311    20kB            304

我目前的解决方案:

PARAMETERS [Start Date] DateTime, [End Date] DateTime, [Upper Bound
Usage in KB] IEEEDouble;

SELECT [Master].[Invc Date], [Master].PktDtVol, [Master].[Mobile Nbr],
DateDiff("d",[Start Date],[End Date]) AS [Difference in days] INTO
Temp_Table
FROM [Master]
WHERE ((([Master].[Invc Date]) >= [Start Date] And
       ([Master].[Invc Date])<=[End Date]) AND
      (([Master].PktDtVol)<= [Upper Bound Usage in KB]));

预计输出中不会出现 647-409-8206 记录,因为它只用了 1 条记录就超过了 50kB(即第 3 条记录),因此将相应地省略所有 647-409-8206 记录。

感谢任何帮助!谢谢!

【问题讨论】:

那些看起来像真实的电话号码并搜索为真实的电话号码。您确定要与很多人分享此内容吗? 它们肯定是假数字,我已经相应地修改了数据 - 但谢谢! 您似乎也有一些设计错误。 查看NOT IN 和子查询。 我已经调查过了,但很遗憾无法将其应用到我的示例中 【参考方案1】:

首先编写一个子查询,选择所有(不同的)手机号码,其中一行违反了阈值。然后从表中选择所有行WHERE [Mobile Nbr] NOT IN (subquery)

【讨论】:

两个答案都有帮助!这是我使用的确切 SELECT 语句:PARAMETERS [Start Date] DateTime, [End Date] DateTime, [Upper Bound Usage in KB] IEEEDouble; SELECT m.[Invc Date], m.PktDtVol, m.[Mobile Nbr], DateDiff("d",[Start Date],[End Date]) AS [Difference in days] INTO Temp_Table FROM Master AS m WHERE (m .[Invc Date]>=[Start Date] And m.[Invc Date])=[以 KB 为单位的上限使用])); 在跟进中,有没有办法优化这个?我正在处理超过 100,000 条记录,查询目前需要很长时间才能完成(接近挂起) 取决于你的数据库系统——我不倾向于使用 ms-access(如果切换是一种选择,我推荐 Postgres、SQL Server 或 Oracle,或者 SQLite 用于轻量级——重量应用程序),但我可以想象 MS Access 处理子查询很差。因此,您可以尝试使用带有子查询的LEFT OUTER JOIN,添加一个WHERE 子句,在该子句中确保子查询键IS NULL'. Basically SELECT ... FROM table LEFT OUTER JOIN (subquery) s ON ... WHERE s.[移动编号] 为 NULL`。这应该确保子查询只评估一次。 我对@9​​87654325@ 感到困惑。 ONWHERE 之间需要什么? 简化将表与子查询连接的连接条件。在您的情况下,如果 t 是您的表并且 s 是您的子查询,那将是 t.[Mobile Nr] = s.[Mobile Nr]【参考方案2】:

这很粗糙,你的设计需要工作,但它应该给你一个开始。

PARAMETERS [Start Date] DATETIME, [End Date] DATETIME, [Upper Bound Usage in KB]
IEEEDOUBLE;

SELECT m.[invc date],
       m.[mobile nbr],
       m.[pktdtvol],
       Datediff("d", [start date], [end date]) AS [Difference in days]
INTO   temp_table
FROM   master AS m
WHERE  m.[invc date] >= [start date]
       AND m.[invc date] <= [end date]
       AND m.[mobile nbr] NOT IN
           (SELECT q.[mobile nbr]
            FROM   master q
            WHERE  q.pktdtvol >= [upper bound usage in kb]) 

【讨论】:

不幸的是,这不起作用,因为我的记录集超过 60,000 条记录。我尝试过使用 INDEXING,但到目前为止还没有奏效。是否有另一种解决方案,或者可能没有正确使用 INDEXING?我使用“CREATE INDEX”创建了一个索引

以上是关于SQL MS Access查询的排除条件的主要内容,如果未能解决你的问题,请参考以下文章

引用其他表的 SQL MS Access 条件更新查询

返回基于多个条件 SQL、MS Access 的非不同行

SQL Like 条件不会显示我的搜索数据 C# 和 Ms Access

查询在 iif ms-access sql 中不返回真值

MS Access VBA:基于查询结果的 VBA 命令

MS-Access:SQL JOIN 和 INSERT INTO 与 WHERE 慢