繁体   English   中英

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

[英]SQL select query to return only if a record has a field of a single value

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

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。

任何帮助将不胜感激!

  • 玩笑
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值,整个客户端被清除。但如果他们只有FINSTP那么那个客户就不会被排除在外。

我的基础是OP说明:

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

这应该这样做:

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'来改进主查询,除了整洁之外,更有可能使用索引(如果存在一个索引)柱)。

我会把它编码为左连接,但我不知道哪些列来自哪些表 - 太多的猜测工作,这个查询将起作用。

假设你的关键是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM