具有多余数据的SQL表损坏了SELECT语句

时间:2018-12-20 17:50:46

标签: sql sql-server tsql

我有两个表格,客户和电子邮件都是通过网页填写的。该join语句将email_id上的customer_id连接起来,而select语句将email_id上的customer_id连接起来(每个表上都有更多,但这些是我关注的行)。以某种方式提交了一封额外的电子邮件,因此当SELECT查询触发每个人的电子邮件时,它都会被上移一个人。我需要在电子邮件表中添加适当的外键约束,但是由于数据已经关闭,所以我不确定如何解决它。

示例:

customer_name customer_id             email email_id
-------------------------             ---------------    
s                 1                      s      1
t                 2                      t      2
u                 3                      t      3
v                 4                      u      4
w                 5                      v      5  

2 个答案:

答案 0 :(得分:0)

因此,在您当前的情况下,客户只能收到一封电子邮件。每个人的电子邮件都向上移动一个人是没有意义的。这意味着您根本没有外键关系。看来这就是您要寻求的关系:

alter table email 
add constraint customer_fx foreign key (email_id) references customer (customer_id)

这将使两个表相关联,并将客户绑定到他们可能拥有的所有电子邮件(您可以限制),但是由于您的数据已经被劫持,因此您必须在应用约束之前对其进行修复。

答案 1 :(得分:0)

如果它与示例中的值刚好相差1,那么您可以这样做:

alter table emails add customer_id int not null default 0;

update emails set customer_id = email_id;
update emails set customer_id = customer_id-1 where email_id > 2;


alter table emails add constraint custEmail  
  foreign key (Customer_id)
  references customers(customer_id);

select *
from customers
left join emails on customers.customer_id = emails.customer_id;

这里是DBFiddle demo