如何在Postgresql中查询不同客户级别的客户数据?

时间:2017-01-23 03:06:37

标签: sql postgresql

目前,我遇到在Posgtresql服务器中运行查询,有3个表包含客户信息,客户申请会员卡和客户付款如下:

  1. 表客户

    customerid, name, lastname, age

  2. 表格付款

    customerid, payment, product, date

  3. 表会员卡

    customerid, membercardno, createddate, status

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

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

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

    对于我的疑问:

    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
    
    在这种情况下,只能查询那些客户是会员客户。 如何查询这两类客户?这对我来说很难。

    我们的专家提供的任何帮助都将非常感谢。

1 个答案:

答案 0 :(得分: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连接更容易理解它的用途。

祝你好运。