到目前为止,我已在此处构建了查询:
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中的一个字段, MIDNAME,LASTNAME,BIRTHDATE来自CMPERSON。我之前应该说过。
如果客户仅具有FINSTP ='F'的政策,我想要返回结果。如果他们有其他策略有FINSTP ='X','V'等,那么我不希望结果中有任何客户记录。
此查询返回多行,因为客户端可以有多个策略。如果我在WHERE子句中放入FINSTP ='F',我可以得到结果,但这不是我想要的。这将返回所有'F'。我不确定还需要在where子句中添加什么来将此查询调整为我需要它做的事情。
这适用于AS / 400系统上的DB2。
非常感谢任何帮助!
答案 0 :(得分:2)
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不会被排除在外。
我的基础是OP说明:
如果客户 仅 的政策规定FINSTP ='F',我想返回结果。如果他们有其他策略有FINSTP ='X','V'等,那么我不希望结果中有任何客户记录。
答案 1 :(得分:1)
这应该这样做:
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
我使用FPSFLG IN ('I', 'P')
而不是FPSFLG 'I' OR FPSFLG = 'P'
改进了您的主查询,除了整洁之外,它更有可能使用索引(如果该列存在一个索引)。
我会将其编码为左连接,但我不知道哪些列来自哪些表 - 猜测工作太多,这个查询都可以。
答案 2 :(得分:0)
假设您的密钥是POLICYNUMBER
,而FINSTP
是PFCASBENE
上的字段;
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 POLICYNUMBER NOT IN(--Policies other than F. You don't want them.
SELECT POLICYNUMBER FROM PFCASBENE
WHERE FINSTP <> 'F'
)
ORDER BY CLIENTNUM ASC