2016-09-28 1 views
1

こんにちはすべて私は以下のロジックについてあなたの助けが必要です。現在、私は300レコードを持つテーブルを持っているが、それは関連しているが、私はそれらの国、POSと呼ばれる列を持っているこの新しいテーブルでは、国+ POの各組み合わせのために私はテーブルAの1レコードを持っている必要があります。SQLロジックまたは不足しているものを見つけるためのクエリ

しかし、状況は、私が最後のテーブルをチェックしているときに、誰かがテーブルAのいくつかのレコードをテーブルbに挿入しただけで、今は何が欠けているのかを見つけなければならないということです。

あなたは私がこれに使用すべきロジックについて私を導くことができます、どんな質問も教えてください。それでも2つのカテゴリが欠落しているカナダを見ることができますが、このテーブルは、すべてのアメリカの国を​​持っているよう

Example 

Table A name Categories 
Milk 
Hot Sauces 
Meat 

Table B 
Category POS Country 
Milk  DF  Mexico 
Meat  DF  Mexico 
Hot Sauces DF  Mexico 
Milk  CC  Canada 

ので、私は20カ国を持っているとしましょう。だから20の倍数で300のカテゴリ私はそれぞれの国がPOSの異なる量を持っているので、私は6000の別個のレコード以上を持っている必要がありますが、誰かが3600レコードを言うように挿入したので、今私はどの組み合わせが見逃されているかを見つけなければなりません。

+0

私は一例に – RARV

+0

http://stackoverflow.com/questions/4602083/sql-compare-data-from-two-tables – FlavorScape

+0

おかげで味をつけてみましょうが、それでもテーブルaとテーブルbが私の質問では列とレコードの量が異なるため、私のシナリオには答えません。 – RARV

答えて

1

Country Tableを持っていない場合は、TableBからDISTINCT Countryを選択して派生させることができます。次に、国とカテゴリ間のデカルト結合(すべての可能な組み合わせ)のカテゴリでそれをクロス結合します。

SELECT countries.country, c.Category 
FROM 
    (SELECT DISTINCT Country 
    FROM 
     @TableB) as countries 
    CROSS JOIN @Categories c 
    LEFT JOIN @TableB b 
    ON countries.Country = b.Country 
    AND c.Category = b.Cateogry 
WHERE 
    b.Cateogry IS NULL 

POSと国とカテゴリのすべての可能な組み合わせが実際に必要な場合。この場合、POSは販売店よりも店のようですが、同じ概念であるように思えます。あなたが持っていなければPOSテーブルを派生させ、国とカテゴリーのクロス・ジョインにクロス・シンクしてください。

SELECT 
    countries.country, c.Category, pos.POS 
FROM 
    (SELECT DISTINCT Country 
    FROM 
     @TableB) as countries 
    CROSS JOIN @Categories c 
    CROSS JOIN (SELECT DISTINCT POS 
     FROM 
      @TableB) as pos 
    LEFT JOIN @TableB b 
    ON countries.Country = b.Country 
    AND c.Category = b.Cateogry 
    AND pos.POS = b.POS 
WHERE 
    b.Cateogry IS NULL 

しかし、私は、あなたはおそらく特定の国で利用可能なPOS年代にPOSのcombiantionsを制限したいので、必ずしもすべてのストアがすべての国であることを推測します。今度は、Countryを含めない場合はテーブルを派生させることができ、派生した国テーブルとそれを内部結合する場合もあります。使用

SELECT 
    countries.country, c.Category, pos.POS 
FROM 
    (SELECT DISTINCT Country 
    FROM 
     @TableB) as countries 
    CROSS JOIN @Categories c 
    INNER JOIN (SELECT DISTINCT Country, POS 
     FROM 
      @TableB) as pos 
    ON countries.Country = pos.Country 
    LEFT JOIN @TableB b 
    ON countries.Country = b.Country 
    AND c.Category = b.Cateogry 
    AND pos.POS = b.POS 
WHERE 
    b.Cateogry IS NULL 

テストデータ:

DECLARE @Categories AS TABLE (Category VARCHAR(25)) 
DECLARE @TableB AS TABLE (Cateogry VARCHAR(25),POS CHAR(2), Country VARCHAR(25)) 
INSERT INTO @Categories VALUES ('Milk'),('Hot Sauces'),('Meat') 
INSERT INTO @TableB VALUES ('Milk','DF','Mexico'),('Meat','DF','Mexico'),('Hot Sauces','DF','Mexico'),('Milk','CC','Canada'),('Milk','XX','Canada') 
0


こんにちは、あなたが不足しているデータを取得するためのロジックの下に使用することができます

SELECT column_name FROM tableA WHERE column_name NOT IN 
(SELECT column_name FROM tableB) 

変更クエリで必要なカラム名とテーブル名。 3つの場所すべてで同じ列名を使用します。

関連する問題