多个表的SQL连接

问题描述:

如何选择显示有贷款但没有dda且没有相关动作类型的custid,除非只有动作类型L的那个?寻找没有dda关系的记录,即使它们是联合相关的(cfrela = J)。 如下所示,A123和B128合格,但由于与DDA帐户有联合关系,因此相关的A123 D行为类型不符合资格。 L =贷款,d = DDA,S =储蓄接近这个多个表的SQL连接

SELECT loans.custid, dda.custid, related.custid 
FROM data.lnmast lnmast 
EXCEPTION JOIN data.dda dda   
ON loans.custid = dda.custid 
JOIN data.related related 
ON loans.custid = related.custid 

LOANS  
custid(c) actype(c) 
A123   L  
B128   L  

DDA  
custid(c) actype(c) 
A125   D  

RELATED  
custid(c) actype(c) cfrela(c) 
A123   D   J 
A123   L   P 
A123   S   J 
B128   L   P 
B128   L   P 
+0

因此,为了澄清,你是否在说,对于贷款你想要的行,无论是否有匹配的dda记录,但所有其他类型只有当没有匹配的dda记录? – WarrenT 2013-02-13 12:28:12

一种方法是用left outer join

select l.* 
from data.lnmast l left outer join 
    (select * 
     from data.dda 
     where actype <> 'L' 
    ) dda 
    on l.custid = dda.custid left outer join 
    data.related r 
    on l.custid = dda.custid 
where dda.custid is null and r.custid is null 

where条款,然后选择不匹配的记录,按您的逻辑。

如果我正确理解你的问题,你想要显示的客户ID不存在于DADA表中,只存在于相关的表中,并使用actype = L?

SELECT L.CustId 
FROM Loans L 
    LEFT JOIN Related R ON L.custid = R.custId AND R.actype <> 'L' 
    LEFT JOIN DDA D ON L.custid = D.custid 
WHERE d.custid IS NULL AND R.custid is NULL 

如果必须有在相关表中的记录,再增加一个INNER JOIN:

SELECT DISTINCT L.CustId 
FROM Loans L 
    INNER JOIN Related R1 ON L.custid = R1.custId AND R1.actype = 'L' 
    LEFT JOIN Related R ON L.custid = R.custId AND R.actype <> 'L' 
    LEFT JOIN DDA D ON L.custid = D.custid 
WHERE d.custid IS NULL AND R.custid is NULL 

希望这有助于。