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