访问 SQL 条件子句多个条件/记录同一列
Posted
技术标签:
【中文标题】访问 SQL 条件子句多个条件/记录同一列【英文标题】:Access SQL Conditional Clause Multiple Conditions/Records Same Column 【发布时间】:2016-02-29 19:40:55 【问题描述】:我在尝试为 MS Access 编写一些 SQL 以按照我希望的方式解析一些数据时遇到了问题。虽然我在 SQL 方面是公认的新手(或者仍在学习五年前上过的大学课程的范围之外),但我想认为我正在尝试做的事情可以完成。
场景: 虽然我一开始可能没有那么高效,但我从两张桌子开始。原始数据集开始时的记录略低于 72k。
本案的目标或我想要完成的目标是找到某人出现多次指控的所有记录,并且被定义为 0 分的指控的结果是有罪的,但是其他指控被认定为 NG 或 Dismissed。
这是我目前所拥有的。我开始使用的数据来自两张表,一张包含外观,一张包含代码和点。
外观示例类似于以下内容:
APP DATE CHARGE OUTCOME
===================================
1 1/1/2014 137 GT
2 1/5/2014 122 GT
2 1/5/2014 123 DI
3 1/6/2014 257 DI
3 1/6/2014 257 DI
4 1/6/2014 137 NG
4 1/6/2014 123 DI
4 1/6/2014 122 GT
我有第二张表将费用与与费用相关的潜在点数联系起来,那里的格式相当简单
CHARGE POINT
===============
122 0
123 2
137 2
257 0
所以我创建了一些基本查询,因为我主要是根据提供给我的批量数据文件来填补空白。第一个拉出的将前两个表连接在一起,所以我得到了一张看起来类似于以下内容的表:
APP DATE CHARGE OUTCOME POINTS
==========================================
1 1/1/2014 137 GT 2
2 1/5/2014 122 GT 0
2 1/5/2014 123 DI 2
3 1/6/2014 257 DI 0
3 1/6/2014 257 DI 0
4 1/6/2014 137 NG 2
4 1/6/2014 123 DI 2
4 1/6/2014 122 GT 0
然后我创建了三个小查询,每个查询都被要求从主查询中生成一个数据子集,一个用于 OUTCOME=GT,Points=0,另一个用于 Outcome=NG,Points>2,最后一个 Outcome=DI,点数>2。每个查询都在生成表查询中调用,该查询将记录集从原来的 72k 降低到 39k。应用另一个查询
Select * from record_set Where RecordID IN
(Select RecordID from record_Set
GROUP BY RecordID
HAVING COUNT (*) > 1))
最后使总数下降到略低于 21k。
我的问题是: 我想返回的数据集需要进一步过滤结果。目前我还没有弄清楚如何清除两个值都为 0 的 APP 值。据我所知,我应该以一种完全不同的方式来处理这个问题。
编辑: 我要寻找的是返回看起来像这样的数据集:
APP DATE CHARGE OUTCOME POINTS
==========================================
2 1/5/2014 122 GT 0
2 1/5/2014 123 DI 2
4 1/6/2014 137 NG 2
4 1/6/2014 123 DI 2
4 1/6/2014 122 GT 0
单条记录被拉到的地方,以及所有涉及费用的 OUTCOME 为 DI/0 的 APP。
我尝试使用直接 WHERE 子句的当前尝试仅评估记录的单个值。我想我正在寻找一种方法来评估两者。如果我将值写入单独的临时表,然后仅为出现在两个表中的 APP 值进行联合,也许会更容易?
任何帮助或指导将不胜感激!
【问题讨论】:
【参考方案1】:我的 MS-Access 经验接近于零,但我相信这种语法会奏效。至少它可能会激发一些想法。
SELECT APP, DATE, CHARGE, OUTCOME, POINTS
FROM APP A
INNER JOIN CHARGE C on C.Charge = A.Charge
WHERE (Outcome = 'GT' and Points = '0')
OR (Outcome = 'NG' and Points > '2')
OR (Outcome = 'DI' and Points > '2')
我不确定两个值都为 0 的情况是什么意思,但很可能您也可以添加另一个 WHERE
子句来过滤掉这些情况。
编辑:
我想我正在寻找的数据集将始终具有以下内容:更多 比一个APP,同时包含一条记录为0 PTS的GT, 和一个(或多个记录)可以是大于 0 的点值 那是DI或NG。我从 2 开始的原因是我知道 没有任何值包含 1,但我想是彻底的 他们可以被包括在内
首先获得满足0 PT和GT要求的APP:
SELECT APP
FROM APP A
INNER JOIN CHARGE C on C.Charge = A.Charge
WHERE Outcome = 'GT'
AND Points = '0'
重用上述获取点值大于0且DI或NG的APP:
SELECT APP
FROM APP A
INNER JOIN CHARGE C on C.Charge = A.Charge
WHERE (Outcome = 'DI' AND Points > '0')
OR (Outcome = 'NG' AND Points > '0')
接下来,将上述逻辑组合成一个查询,使用两个子查询,只拉取满足两个要求的APP数据:
SELECT APP, DATE, A.CHARGE, OUTCOME, POINTS
FROM APP A
INNER JOIN CHARGE C on C.Charge = A.Charge
WHERE APP IN (
SELECT APP
FROM APP A
INNER JOIN CHARGE C on C.Charge = A.Charge
WHERE Outcome = 'GT'
AND Points = '0'
)
AND APP IN (
SELECT APP
FROM APP A
INNER JOIN CHARGE C on C.Charge = A.Charge
WHERE (Outcome = 'NG' AND Points > '0')
OR (Outcome = 'DI' AND Points > '0')
)
这将导致只有 APP 具有 GT、0 PT 费用,以及另一个具有 1 或更大 PT 的 DI 或 NG 费用。
【讨论】:
很抱歉,我清理了我的问题以便更清楚一点。我想要做的是清除所有实例,其中说记录包含的点值仅为 0。因此,如果有人有 5 条记录,我需要能够将它们与自己进行比较。 到目前为止,我必须解决的唯一想法如下:将有积分的费用/应用程序组合与没有积分的费用/应用程序组合分开。生成仅适用 APP 的列表,然后在两个表之间进行比较。如果两者都没有出现,那么它就不会被包括在内....也许?想法? 我还是有点困惑——用你的逻辑测试我的建议会给你留下你要求的结果集。 sqlfiddle.com/#!9/97c0c/3 注:我把点数设为大于等于2,而不是大于2。我想这就是你的意思,否则只会返回GT/0。 我想我正在寻找的数据集总是有以下内容:多个APP,同时包含一条记录为0 PTS的GT,以及一条(或多条记录)可以是大于 0 的点值是 DI 或 NG。我从 2 开始的原因是我知道没有任何包含 1 的值,但我想要彻底,它们可以包括在内。以上是关于访问 SQL 条件子句多个条件/记录同一列的主要内容,如果未能解决你的问题,请参考以下文章
“java.sql.SQLSyntaxErrorException:'on 子句'中的未知列'*'”在休眠条件下加入表时