2016-04-04 28 views
1

sorgusu hariç tutulduğu için, verileri bire-çok tablo ilişkisinden çekmekte güçlük çekiyorum. Henüz "Yankı" garanti koduna sahip olmayan bir ekipman sözleşmesi listesi almam gerekiyor. Senaryomda bir ekipman sözleşmeleri ve garanti tablosu var.Bir Çoktan Sorgulama

ekipman-sözleşmeler masaya (EQC bundan sonra) tasarımıdır:


------------------------------------------------------------------------------------ 
| 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| 
------------------------------------------------------------------------------------ 

garanti masanın (WAR bundan sonra) tasarımı olan: Yapmam gereken şey


--------------------------------------------------- 
| 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 | 
--------------------------------------------------- 

toplarlamanızdır Henüz "Echo" garanti koduna sahip olmayan EQC'lerin bir listesi. Bunun anlamı, ya Echo kaydına sahip olmadıkları ya da henüz garanti kayıt süresinin bulunmadığı anlamına gelir.

Benim sonuç kümesi gibi görünmelidir: (. Onlar Echo WarrantyCode uygulanan çünkü GDS12 & BQWSD exclueded edilir)


------------------------------------------------------------------------------------ 
| 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| 
------------------------------------------------------------------------------------ 

Benim sorgu:

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' 

Sonuç kümesi bunun yerine şöyle görünür:


------------------------------------------------------------------------------------ 
| 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| 
------------------------------------------------------------------------------------ 

cevap

3

'un numaralı bir Yankı SAVUNU bulunmayan EQC'leri istiyorsunuz. Veya başka bir deyişle: olan EQC'lerin Yankı SAVAŞı ayarında değil olmasını istemezsiniz.

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' 
); 

Veya:

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

GÜNCELLEME: Emin değilim, ancak, yukarıda gösterildiği gibi SQL Server İÇİNDE maddelerinde dizilerini destekleyip desteklemediğini. Görebildiğiniz gibi sorguları gerçekten okunabilir hale getiren harika bir özellik. Ancak bazı DBMS bu sözdizimini ne yazık ki desteklemiyor.

+0

Bu sorunun sadece bir kısmını yanıtlamanızın yanı sıra, tarihe de dahil olmak zorundasınız. OP, "ya Echo kaydına sahip değiller ya da henüz garanti kayıt süresine sahip değillerdi" diye sordu. – twoleggedhorse

+0

@twoleggedhorse: Ben öyle düşünmüyorum. Ya bir Echo garanti kaydı var ya da yok. Yoksa garanti tablosunda gelecekteki tarihleri ​​beklemek zorunda mıyız? Öyleyse, evet, bugün ile bir tarih karşılaştırması eklemek zorunda kalacağız. –

+0

Çok açık değil biliyorum, ama bence, gelecekte – twoleggedhorse