2016-04-04 8 views
1

1対多のテーブル関係からデータを取得するのが難しいです。 「エコ」保証コードがまだ適用されていない機器契約のリストをプルする必要があります。 私のシナリオでは、機器契約テーブルと保証テーブルがあります。1対多のクエリの結果を除外する

機器・契約テーブル(EQC以下)のデザインは、次のとおりです。


------------------------------------------------------------------------------------ 
| EquipmentID | Contract | SerialNumber | Make | Model | Date   | Customer | 
------------------------------------------------------------------------------------ 
| 001   | A1  | GDS12  | GRND | GR219 | 2016-03-02 | Acme Corp| 
| 002   | B1  | BQWSD  | BQW | BLU22 | 2016-03-10 | Fast Lawn| 
| 003   | C1  | Foo36  | Foo | Red18 | 2016-03-04 | Perfect T| 
| 004   | D1  | Foo37  | Foo | Red18 | 2016-03-04 | Perfect T| 
| 005   | E1  | Foo38  | Foo | Red18 | 2016-03-01 | Perfect T| 
------------------------------------------------------------------------------------ 

保証テーブル(WARの以下)の設計は次のとおりです。


--------------------------------------------------- 
| SerialNum | Make | WarrantyCode | Warranty Date| 
--------------------------------------------------- 
| GDS12  | GRND | Alpha  | 2016-04-01 | 
| GDS12  | GRND | Bravo  | 2016-04-01 | 
| GDS12  | GRND | Delta  | 2016-04-01 | 
| GDS12  | GRND | Charlie  | 2016-04-01 | 
| GDS12  | GRND | Echo   | 2016-04-01 | 
| BQWSD  | BQW | Alpha  | 2016-04-01 | 
| BQWSD  | BQW | Bravo  | 2016-04-01 | 
| BQWSD  | BQW | Charlie  | 2016-04-01 | 
| BQWSD  | BQW | Foxtrot  | 2016-04-01 | 
| BQWSD  | BQW | Echo   | 2016-04-01 | 
| Foo36  | Foo | Alpha  | 2016-04-01 | 
| Foo36  | Foo | Bravo  | 2016-04-01 | 
| Foo36  | Foo | Charlie  | 2016-04-01 | 
| Foo36  | Foo | Hotel  | 2016-04-01 | 
--------------------------------------------------- 

私がする必要がどのようなプルです「エコー」保証コードがまだ適用されていないEQCのリスト。つまり、エコーレコードがないか、まだ保証記録期間がありません。

私の結果セットは次のようになります。(。彼らはエコーWarrantyCodeが適用されているのでGDS12 & BQWSDがexcluededされている)


------------------------------------------------------------------------------------ 
| EquipmentID | Contract | SerialNumber | Make | Model | Date   | Customer | 
------------------------------------------------------------------------------------ 
| 003   | C1  | Foo36  | Foo | Red18 | 2016-03-04 | Perfect T| 
| 004   | D1  | Foo37  | Foo | Red18 | 2016-03-04 | Perfect T| 
| 005   | E1  | Foo38  | Foo | Red18 | 2016-03-01 | Perfect T| 
------------------------------------------------------------------------------------ 

私のクエリは次のとおりです。

SELECT EQC.EquipmentID 
    ,EQC.Contract 
    ,EQC.SerialNumber 
    ,EQC.Make 
    ,EQC.Model 
    ,EQC.DATE 
    ,EQC.Customer 
FROM equipment - contracts EQC 
LEFT JOIN warranty WAR 
    ON WAR.SerialNum = EQC.SerialNumber 
    AND WAR.Make = EQC.Make 
WHERE WAR.WarrantyCode is null 
    OR WAR.WarrantyCode <> 'Echo' 

結果セットは次のようになります。


------------------------------------------------------------------------------------ 
| EquipmentID | Contract | SerialNumber | Make | Model | Date   | Customer | 
------------------------------------------------------------------------------------ 
| 001   | A1  | GDS12  | GRND | GR219 | 2016-03-02 | Acme Corp| 
| 001   | A1  | GDS12  | GRND | GR219 | 2016-03-02 | Acme Corp| 
| 001   | A1  | GDS12  | GRND | GR219 | 2016-03-02 | Acme Corp| 
| 001   | A1  | GDS12  | GRND | GR219 | 2016-03-02 | Acme Corp| 
| 002   | B1  | BQWSD  | BQW | BLU22 | 2016-03-10 | Fast Lawn| 
| 002   | B1  | BQWSD  | BQW | BLU22 | 2016-03-10 | Fast Lawn| 
| 002   | B1  | BQWSD  | BQW | BLU22 | 2016-03-10 | Fast Lawn| 
| 002   | B1  | BQWSD  | BQW | BLU22 | 2016-03-10 | Fast Lawn| 
| 003   | C1  | Foo36  | Foo | Red18 | 2016-03-04 | Perfect T| 
| 003   | C1  | Foo36  | Foo | Red18 | 2016-03-04 | Perfect T| 
| 003   | C1  | Foo36  | Foo | Red18 | 2016-03-04 | Perfect T| 
| 003   | C1  | Foo36  | Foo | Red18 | 2016-03-04 | Perfect T| 
| 004   | D1  | Foo37  | Foo | Red18 | 2016-03-04 | Perfect T| 
| 005   | E1  | Foo38  | Foo | Red18 | 2016-03-01 | Perfect T| 
------------------------------------------------------------------------------------ 

答えて

3

が存在しないEQCを追加するエコーWAR。つまり、でないEQCをのEcho WARに設定したいとします。

select * 
from equipment eqc 
where not exists 
(
    select * 
    from warranty war 
    where war.serialnum = eqc.serialnumber 
    and war.make = eqc.make 
    and war.warrantycode = 'Echo' 
); 

または:

select * 
from equipment 
where (serialnumber, make) not in 
(
    select serialnum, make 
    from warranty 
    where warrantycode = 'Echo' 
); 

UPDATE:私は上記のようにSQL ServerのがIN句でのタプルをサポートしているかどうか、しかし、わかりません。表示できるようにクエリを本当に読みやすくする素晴らしい機能ですが、残念なことに、この構文をサポートしていないDBMSもあります。

+0

これは質問の一部にしか答えるものではなく、日付を考慮する必要があります。 OPは「エコーレコードがないか、まだ保証記録期間がない」と尋ねた。 – twoleggedhorse

+0

@twoleggedhorse:そうは思わない。エコーの保証記録があるかどうか。または、保証表の将来の日付を期待する必要があると思いますか?それで、はい、今日の日付比較を保証のどこに追加する必要がありますか? –

+0

私は知っていますが、それは将来の日付が追加されることを意味していると思います – twoleggedhorse

関連する問題