2016-08-19 47 views
1

比方说,我在SQL Server 2008中,UsersSiteUserSite 3个表:寻找失踪的连接表的SQL Server记录

+-------+ +-------+ +-------------+ 
| User | | Site | | User Site | 
+-------+ +-------+ +-------------+ 
| User1 | | Site1 | | User1 Site1 | 
| User2 | | Site2 | | User1 Site2 | 
| User3 | +-------+ | User1 Site3 | 
+-------+     | User2 Site1 | 
          | User2 Site3 | 
          | User3 Site1 | 
          +-------------+ 

期望的结果:对于每个UserSite组合必须有一个记录在UserSite这样的:

+-------------+ 
| User Site | 
+-------------+ 
| User1 Site1 | 
| User1 Site2 | 
| User1 Site3 | 
| User2 Site1 | 
|*User2 Site2*| Inserted 
| User2 Site3 | 
| User3 Site1 | 
|*User3 Site2*| Inserted 
|*User3 Site3*| Inserted 
+-------------+ 

我只能插入新记录,并且不能从头改写表。

有没有办法与SQL Server做到这一点?

回答

4

我可能会提出一个强力方法。截断表,然后插入所有的值:

truncate table UserSite; 

insert into UserSite(User, Site) 
    select u.user, s.site 
    from users u cross join sites s; 

你可以只用一个稍微复杂的查询添加新的:

insert into UserSite(User, Site) 
    select u.user, s.site 
    from users u cross join 
     sites s 
    where not exists (select 1 
         from usersite us 
         where us.user = u.user and us.site = s.site 
        ); 
+1

我不能截断表。第二个查询可能会起作用,我现在试试吧 – Szer

+0

像魅力一样工作。谢谢! – Szer

+0

@Gordon为什么你的第二个查询比用户站点表字段为空的“用户站点”表的左外连接更可取? –

1

使用CROSS JOIN

SELECT 
* 
FROM Users 
CROSS JOIN Site 
1

如果你只想选择缺失的记录,试试这个:

SELECT * 
FROM Users 
CROSS JOIN Site 

EXCEPT 

SELECT * 
FROM UserSite