SQL select查询仅在记录具有单个值的字段时返回

SQL select查询仅在记录具有单个值的字段时返回,sql,select,db2,Sql,Select,Db2,到目前为止,我已经在这里构建了我的查询: SELECT POLICYNUMBER, FPLAN, FEFFYY, FEFFMM, FEFFDD, FINSTP, CLIENTNUM, FIRSTNAME, MIDNAME, LASTNAME, BIRTHDATE FROM PFCASBENE INNER JOIN CMRELATN ON POLICYNUMBER = KEYFIELD1 INNER JOIN CMPERSON ON CLIENTNUM = CLIENTID WHERE FP

到目前为止,我已经在这里构建了我的查询:

SELECT POLICYNUMBER, FPLAN, FEFFYY, FEFFMM, FEFFDD, FINSTP, CLIENTNUM, FIRSTNAME, 
MIDNAME, LASTNAME, BIRTHDATE FROM PFCASBENE 
INNER JOIN CMRELATN ON POLICYNUMBER = KEYFIELD1 
INNER JOIN CMPERSON ON CLIENTNUM = CLIENTID
WHERE FPSFLG='I' OR FPSFLG='P' ORDER BY CLIENTNUM ASC
FINSTP字段具有保险类型代码的单个字符

编辑:POLICYNUMBER、FPLAN、FEFFYY、FEFFMM、FEFFDD、FINSTP是PFCASBENE中的字段 CLIENTNUM是CMRELATN和FIRSTNAME中的字段, 中名、姓氏、出生日期来自CMPERSON。我早该这么说的

如果客户端只有FINSTP='F'指定的策略,我想返回结果。如果他们有其他具有FINSTP='X','V'等的策略,那么我不希望结果中有任何客户机记录

此查询返回多行,因为客户端可以有多个策略。如果我把FINSTP='F'放在WHERE子句中,我可以得到结果,但这不是我想要的。返回所有的“F”。我不确定还需要在where子句中添加哪些内容来调整此查询,使其符合我的需要

这适用于AS/400系统上的DB2

任何帮助都将不胜感激

乔希 假设您的密钥是POLICYNUMBER,FINSTP是PFCASBENE上的一个字段

这应该做到:

SELECT POLICYNUMBER, FPLAN, FEFFYY, FEFFMM, FEFFDD, FINSTP, CLIENTNUM, FIRSTNAME, 
MIDNAME, LASTNAME, BIRTHDATE
FROM PFCASBENE 
JOIN CMRELATN ON POLICYNUMBER = KEYFIELD1 
JOIN CMPERSON ON CLIENTNUM = CLIENTID
WHERE FPSFLG IN ('I', 'P')
AND CLIENTNUM NOT IN (
    SELECT CLIENTNUM
    FROM PFCASBENE 
    JOIN CMRELATN ON POLICYNUMBER = KEYFIELD1 
    JOIN CMPERSON ON CLIENTNUM = CLIENTID
    WHERE FINSTP != 'F'
)
ORDER BY CLIENTNUM ASC
我改进了您的主查询,在“I”、“p”中使用FPSFLG,而不是FPSFLG“I”或FPSFLG=“p”,这不仅更简洁,而且如果该列上存在索引,则更可能使用索引

我本来会将其编码为左连接,但我不知道哪些列来自哪些表——猜测太多,这个查询也会起作用

SELECT POLICYNUMBER, FPLAN, FEFFYY, FEFFMM, FEFFDD, FINSTP, CLIENTNUM, FIRSTNAME, 
MIDNAME, LASTNAME, BIRTHDATE FROM PFCASBENE 
INNER JOIN CMRELATN ON POLICYNUMBER = KEYFIELD1 
INNER JOIN CMPERSON ON CLIENTNUM = CLIENTID
WHERE (FPSFLG='I' OR FPSFLG='P') AND CLIENTNUM not in (
SELECT CLIENTNUM FROM PFCASBENE 
INNER JOIN CMRELATN ON POLICYNUMBER = KEYFIELD1 
INNER JOIN CMPERSON ON CLIENTNUM = CLIENTID
WHERE FINSTP <> 'F')
ORDER BY CLIENTNUM ASC
Sub select表示,返回FINSTP不等于F的所有客户端记录,然后排除该客户端结果,即使它们的FINSTP为F,但由于其他FINSTP值,整个客户端将被删除。但如果他们只有F的FINSTP,那么该客户机就不会被排除在外

我是根据这篇文章写的:


如果客户端只有FINSTP='F'指定的策略,我想返回结果。如果他们的其他策略的FINSTP='X','V',等等,那么我不希望结果中有任何客户端记录。

该字段FINSTP来自哪个表?哪种RDBMS?@sgeddes抱歉,FINSTP来自PFCASBENE表。编辑了这是针对哪个RDBMS/系统的问题。Josh,我想可能有一个更好的答案。您知道如何从System i Navigator中的run SQL语句窗口运行Visual Explain,以便进行比较吗?@warrent是的,我知道。我本来打算在这里休息一下,有时间的时候就这么做。这个查询需要非常长的时间才能运行+20分钟,我相信这是由于内部查询造成的。我用java将查询分为两个单独的列表,并用大约30秒的时间相互比较。我将很快运行可视化解释。是的,这非常接近我需要的。POLICYNUMBER、FPLAN、FEFFYY、FEFFMM、FEFFDD、FINSTP是PFCASBENE中的字段。CLIENTNUM是CMRELATN中的一个字段。名、中名、姓、出生日期来自CMPERSON。我早该这么说的。是的,如果他们只有FINSTP为“F”的策略,那么我希望看到它们,如果他们有“F”和其他类型,或者只是其他类型,我不希望它们出现在结果中。非常感谢!就是这样:这对于将where子句转换为能够使用索引很有帮助。非常感谢!
SELECT POLICYNUMBER, FPLAN, FEFFYY, FEFFMM, FEFFDD, FINSTP, CLIENTNUM, FIRSTNAME, 
MIDNAME, LASTNAME, BIRTHDATE FROM PFCASBENE 
INNER JOIN CMRELATN ON POLICYNUMBER = KEYFIELD1 
INNER JOIN CMPERSON ON CLIENTNUM = CLIENTID
WHERE (FPSFLG='I' OR FPSFLG='P') AND CLIENTNUM not in (
SELECT CLIENTNUM FROM PFCASBENE 
INNER JOIN CMRELATN ON POLICYNUMBER = KEYFIELD1 
INNER JOIN CMPERSON ON CLIENTNUM = CLIENTID
WHERE FINSTP <> 'F')
ORDER BY CLIENTNUM ASC