2016-08-19 6 views
1

のは、私は3つのSQL Server 2008のテーブル、UsersSiteUserSiteを持っているとしましょう:結合テーブルのSQL Serverで欠落しているレコードを検索

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

望ましい結果:そこに各UserためとSiteコンボは、レコードである必要がありますこのような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

テーブルを切り捨てることはできません。 2番目のクエリが機能するかもしれないが、今試してみる – Szer

+0

魅力的なように働いた。ありがとうございました! – Szer

+0

@ Gordon User Siteテーブルのフィールドがnullの「User Site」テーブルへの左外部結合に、2番目のクエリを優先させるのはなぜですか? –

1

使用クロス

SELECT 
* 
FROM Users 
CROSS JOIN Site 
1

た場合のJOIN不足しているレコードのみを選択するには、次のように入力してください:

SELECT * 
FROM Users 
CROSS JOIN Site 

EXCEPT 

SELECT * 
FROM UserSite 
関連する問題