Sql server 如何防止SQL联接重复?
我有以下表格: 客户: 身份证件 客户号 公司 名字 姓氏 客户经理电子邮件 电子邮件 评论 条款 税号 铅源 默认目录 信用额度 99453 C00123456 宁静公司。 马尔科姆 雷诺兹 吉姆。smith@example.com mal@example.com 船长 1. 无效的 无效的 12345 无效的 99468 C00123456 宁静公司。 佐伊 沃什伯恩 吉姆。smith@example.com zoe@example.com 无效的 1. 无效的 无效的 无效的 无效的 99960 C00123456 宁静公司。 霍班 沃什伯恩 吉姆。smith@example.com wash@example.com 无效的 1. 无效的 无效的 无效的 无效的 100088 C00123456 宁静公司。 伊娜拉 塞拉 吉姆。smith@example.com inara@example.com 无效的 1. 无效的 无效的 12345 无效的Sql server 如何防止SQL联接重复?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我有以下表格: 客户: 身份证件 客户号 公司 名字 姓氏 客户经理电子邮件 电子邮件 评论 条款 税号 铅源 默认目录 信用额度 99453 C00123456 宁静公司。 马尔科姆 雷诺兹 吉姆。smith@example.com mal@example.com 船长 1. 无效的 无效的 12345 无效的 99468 C00123456 宁静公司。 佐伊 沃什伯恩 吉姆。smith@example.com zoe@example.com 无效的 1. 无效的 无效的 无效的 无效的 99
要删除重复项,需要枚举每一行,并根据排序条件指定一个值 您可以使用cte轻松实现这一点-我相信它们在SQL Server 2005中可用,当然我无法检查
with c as(
select *, Row_Number() over(partition by customer_number order by id) rn
from customer
),
ca as (
select *, Row_Number() over(partition by company order by created_at) rn
from customer_address
)
select <columns>
from c join ca on c.company=ca.company
where c.rn=1 and ca.rn=1 and c.customer_number='C00123456'
要删除重复项,需要枚举每一行,并根据排序条件指定一个值 您可以使用cte轻松实现这一点-我相信它们在SQL Server 2005中可用,当然我无法检查
with c as(
select *, Row_Number() over(partition by customer_number order by id) rn
from customer
),
ca as (
select *, Row_Number() over(partition by company order by created_at) rn
from customer_address
)
select <columns>
from c join ca on c.company=ca.company
where c.rn=1 and ca.rn=1 and c.customer_number='C00123456'
你还尝试了其他什么连接 以下是为每个客户记录选择最新客户地址记录的一种方法:
SELECT c.*, a.* FROM
customer c
LEFT JOIN
( SELECT x.* FROM customer_address x
INNER JOIN
(SELECT company, MAX(created_at) AS created_at FROM customer_address
GROUP BY company) u
ON u.company=x.company AND u.created_at=x.created_at
) a
ON a.company=c.company
WHERE c.customer_number = 'C00123456';
因此,所有其他客户地址记录将由以下人员提供:
( SELECT x.* FROM customer_address x
INNER JOIN
(SELECT company, MAX(created_at) AS created_at FROM customer_address
GROUP BY company) u
ON u.company=x.company AND NOT u.created_at=x.created_at
) a
你还尝试了其他什么连接 以下是为每个客户记录选择最新客户地址记录的一种方法:
SELECT c.*, a.* FROM
customer c
LEFT JOIN
( SELECT x.* FROM customer_address x
INNER JOIN
(SELECT company, MAX(created_at) AS created_at FROM customer_address
GROUP BY company) u
ON u.company=x.company AND u.created_at=x.created_at
) a
ON a.company=c.company
WHERE c.customer_number = 'C00123456';
因此,所有其他客户地址记录将由以下人员提供:
( SELECT x.* FROM customer_address x
INNER JOIN
(SELECT company, MAX(created_at) AS created_at FROM customer_address
GROUP BY company) u
ON u.company=x.company AND NOT u.created_at=x.created_at
) a
您确定不能可靠地在fristname和lastname上加入吗?我回答说这两个栏目看起来像是造成了你的重复,但现在我很好奇为什么你不能使用这两个栏目?如果你不能可靠地使用它们,你就必须有创意地分步骤按摩,找出正确的方法。我还假设你不需要应付账款的记录?你有4行连接到10行的匹配值,所以当然4x10=40。您的Customers表中没有一个created_at,它位于您的Customers_地址中。如果您只需要一行,那么它可能是最小的客户Id?您到底尝试了哪些其他连接?可能值得学习SQL基础知识,例如在以下站点:customer\u address应该有一个customer\u id列,该列是将每个customer\u地址与客户关联的外键。为什么不呢?@DavidBrowne-Microsoft我同意并希望我能回答这个问题,但不幸的是,我没有。你确定不能可靠地在fristname和lastname加入吗?我回答说这两个栏目看起来像是造成了你的重复,但现在我很好奇为什么你不能使用这两个栏目?如果你不能可靠地使用它们,你就必须有创意地分步骤按摩,找出正确的方法。我还假设你不需要应付账款的记录?你有4行连接到10行的匹配值,所以当然4x10=40。您的Customers表中没有一个created_at,它位于您的Customers_地址中。如果您只需要一行,那么它可能是最小的客户Id?您到底尝试了哪些其他连接?可能值得学习SQL基础知识,例如在以下站点:customer\u address应该有一个customer\u id列,该列是将每个customer\u地址与客户关联的外键。为什么不呢?@DavidBrowne-Microsoft我同意并希望我能回答这个问题,但不幸的是,我没有。