Sql 内部连接多个表,但需要基于一列的不同数据

Sql 内部连接多个表,但需要基于一列的不同数据,sql,inner-join,distinct,Sql,Inner Join,Distinct,由于工作原因,一般详细信息如下 我们目前将客户、客户地址和客户电子邮件放在所有单独的表格中。我正在尝试运行一个报告,其中我将内部联接这些表,但我只希望它根据customers表提供不同的结果。我遇到的问题是,它仍然返回倍数,因为有人可能更新了一封电子邮件,并插入了一条新记录 尝试移动DISTINCT以及执行“GROUPBY”子句,但都没有返回正确的结果。有一个“上次修改”列,所以我可能只能得到最近修改的结果 即查尔斯·史密斯,共3排 约翰·史密斯4排 等 我可以设置modified语句,使其只返

由于工作原因,一般详细信息如下

我们目前将客户、客户地址和客户电子邮件放在所有单独的表格中。我正在尝试运行一个报告,其中我将内部联接这些表,但我只希望它根据customers表提供不同的结果。我遇到的问题是,它仍然返回倍数,因为有人可能更新了一封电子邮件,并插入了一条新记录

尝试移动DISTINCT以及执行“GROUPBY”子句,但都没有返回正确的结果。有一个“上次修改”列,所以我可能只能得到最近修改的结果

即查尔斯·史密斯,共3排 约翰·史密斯4排 等 我可以设置modified语句,使其只返回这些语句中最后一个修改的语句吗

select
c.customer_id
c.first_name
c.last_name
ce.email_address
ca.addr_street
ca.addr_city
ca.addr_zip
FROM Customers C
INNER JOIN Cust_Address ca ON c.cust_id=ca.addr_cust_id
Inner JOIN Cust_Email ce ON c.cust_id=ce.email_cust_id
我只希望它为每个客户返回一条记录,无论他们在系统中有多少地址/电子邮件。

使用
行号()
和子查询:

SELECT c.customer_id, c.first_name, c.last_name,
       ce.email_address, ca.addr_street, ca.addr_city ca.addr_zip
FROM Customers C INNER JOIN
     (SELECT ca.*,
             ROW_NUMBER() OVER (PARTITION BY addr_cust_id ORDER BY lastmodified DESC) as seqnum
      FROM Cust_Address ca
     ) ca
     ON c.cust_id = ca.addr_cust_id INNER JOIN
     (SELECT ce.*,
             ROW_NUMBER() OVER (PARTITION BY email_cust_id ORDER BY lastmodified DESC) as seqnum
      FROM Cust_Email ce
     ) ce
     ON c.cust_id = ce.email_cust_id
WHERE ca.seqnum = 1 AND ce.seqnum = 1;

如问题所述,如果重复项来自
cust_email
,并且当您在结果集中显示该表中的一列时,解决方案是将其从联接中删除,并在
select
子句中使用内联查询,如下所示:

select
    c.customer_id
    c.first_name
    c.last_name
    (
        select email_address 
        from cust_email ce 
        where c.cust_id = ce.email_cust_id 
        order by ce.last_modified desc 
        limit 1
    ) email_address
    ca.addr_street
    ca.addr_city
    ca.addr_zip
from 
    customers c
    inner join cust_address ca on c.cust_id=ca.addr_cust_id
此解决方案使用
limit
子句(MySQL和Postgres中特别支持);语法可能因您的RDBMS而异(通常,SQLServer和Oracle具有不同的语法)


cust\u email(cust\u id)
上有一个索引,这应该是一个有效的解决方案,避免了窗口功能的需要。

您使用的是哪种dbms?(不同的产品在这里有不同的解决方案。)向我们展示一些示例表数据和预期结果-全部为格式化文本,而不是图像。首先,看一看。这个很有效!!!!!非常感谢。我对运行函数相当陌生,不确定哪里出了问题。技术界的新手,并试图弄明白事情的真相。