2017-01-23 94 views
0

目前,我在Posgtresql服务器运行的查询会遇到的问题有3个表包含客户信息,谁申请membercard客户支付如下客户:如何在Postgresql中查询具有不同客户级别的客户数据?

  1. 表客户

    customerid, name, lastname, age

  2. 付款

    customerid, payment, product, date

  3. 表membercard

    customerid, membercardno, createddate, status

在我的系统中,有2种客户,如经常和会员客户的。

  • 一般客户是那些尚未申请成为会员客户的客户。
  • 会员客户是那些已经申请成为客户的客户。

在这种情况下,我想查询这3个表中的所有2种客户。 例如:客户ID,姓名,姓氏,年龄,membercardno,支付,产品,日期

对于我的查询:

SELECT C.CUSTOMERID, C.NAME, C.LASTNAME, C.AGE, 
     M.MEMBERCARDNO, P.PAYMENT, P.PRODUCT, P.DATE 
    FROM CUSTOMER C, 
     MEMBERCARD M, 
     PAYMENT P 
    WHERE C.CUSTOMERID = M.MEMBERCARD AND 
     C.CUSTOMERID = P.CUSTOMERID 
    ORDER BY CUSTOMERID 

在这种情况下,就只能那些客户是会员客户查询。 如何查询这两种客户?这对我来说很难做到。

从我们的专家任何帮助将非常感激。

回答

0

您需要使用OUTER JOIN来拉入会员卡数据,因为并非所有客户都有会员卡。

SELECT C.CUSTOMERID, C.NAME, C.LASTNAME, C.AGE, 
     M.MEMBERCARDNO, P.PAYMENT, P.PRODUCT, P.DATE 
    FROM CUSTOMER C 
    LEFT OUTER JOIN MEMBERCARD M 
    ON M.MEMBERCARD = c.CUSTOMERID 
    LEFT OUTER JOIN PAYMENT P 
    ON P.CUSTOMERID = C.CUSTOMERID 
    ORDER BY C.CUSTOMERID 

OUTER JOIN是一个可选的连接 - 如果数据存在于根表中但不存在于连接表中,它仍将返回。将其与INNER JOIN(这是你正在做的事情,尽管你可能没有意识到)对比,在匹配数据必须存在于连接的两个表中才能返回结果。

另外,养成如上所示使用ANSI风格连接的习惯,而不要使用原始查询中使用的旧式隐式连接。了解ANSI加入的过程更加容易。

祝你好运。

+0

太棒了!完美先生。 非常感谢你的时间,并善意帮助我。 谢谢, – SmallCorner