Sql 内部连接多个表,但需要基于一列的不同数据
由于工作原因,一般详细信息如下 我们目前将客户、客户地址和客户电子邮件放在所有单独的表格中。我正在尝试运行一个报告,其中我将内部联接这些表,但我只希望它根据customers表提供不同的结果。我遇到的问题是,它仍然返回倍数,因为有人可能更新了一封电子邮件,并插入了一条新记录 尝试移动DISTINCT以及执行“GROUPBY”子句,但都没有返回正确的结果。有一个“上次修改”列,所以我可能只能得到最近修改的结果 即查尔斯·史密斯,共3排 约翰·史密斯4排 等 我可以设置modified语句,使其只返回这些语句中最后一个修改的语句吗Sql 内部连接多个表,但需要基于一列的不同数据,sql,inner-join,distinct,Sql,Inner Join,Distinct,由于工作原因,一般详细信息如下 我们目前将客户、客户地址和客户电子邮件放在所有单独的表格中。我正在尝试运行一个报告,其中我将内部联接这些表,但我只希望它根据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?(不同的产品在这里有不同的解决方案。)向我们展示一些示例表数据和预期结果-全部为格式化文本,而不是图像。首先,看一看。这个很有效!!!!!非常感谢。我对运行函数相当陌生,不确定哪里出了问题。技术界的新手,并试图弄明白事情的真相。