2

これらは私のテーブルです:

`room`(roomID,roomNum)  
`customer`(customerID,Surname,etc)  
`contract`(contractID,roomID,weekNum)  
`paymen`t(paymentID,customerID,contractID,YearKoino)  

そして、次のクエリを使用すると:

`select` room.roomnum  
`from` payment,contract,room,customer  
`where` payment.contractID = contract.contractID  
`and` contract.roomID=room.roomID  
`and` customer.customerID=payment.customerID  
`and` contract.weeknum='40'  
`and` payment.YearKoino='2007' ;  

私が得ている結果は次のとおりです。

+---------+  
| roomnum |  
+---------+  
| Δ-12    |  
| Γ-22    |  
| Α-32    |  
| Γ-21    |  
| Δ-11    |  
| Ε-12    |  
| Γ-31    |  
| Ε-22    |  
| Α-22    |  
| Δ-12    |  
| Γ-12    |  
+---------+  
11 rows in set  

私がやりたいのは、正反対の結果を返すクエリを実行することです(テーブル支払いにないテーブルルームのroomnums)。これは、上記のクエリのroomumの結果を部屋のroomnum列と比較することで実行できますtable.これまでの私の取り組みの一部:

`Select` room.roomnum  
`from` room  
`where` NOT EXISTS  
(`select` room.roomnum  
`from` payment,contract,room,customer  
`where` payment.contractID = contract.contractID  
`and` contract.roomID=room.roomID  
`and` customer.customerID=payment.customerID  
`and` contract.weeknum='40'  
`AND` payment.YearKoino='2007');  
Empty set  

`SELECT` *
`FROM` customer a
`LEFT OUTER JOIN` payment b
`on` a.customerID=b.customerID
`where` a.customer is null;

また、「NOT EXISTS」を「NOT IN」に置き換えようとしましたが、無駄でした。それを行う最良の方法は「左結合」を使用することだと読んだことがあります。単純なテーブルですが、私の例では、テーブルの結合にある列と列を比較する必要があります...

アドバイスをいただければ幸いです。

4

2 に答える 2

3

なぜnot inうまくいかなかったのかわかりません。

これは機能するはずです(テーブル名のエイリアスで not を使用):

   Select r1.roomnum 
   from room AS r1
   where r1.roomnum NOT IN 
       (select r2.roomnum 
        from payment,contract,room as r2,customer 
        where payment.contractID = contract.contractID
        and contract.roomID=r2.roomID 
        and customer.customerID=payment.customerID 
        and contract.weeknum='40' 
        AND payment.YearKoino='2007');
于 2012-11-21T21:10:08.840 に答える
1

もちろん、NOT EXISTS クエリをメイン クエリと関連付ける必要があります。

Select 
  roomnum 
from 
  room main
where 
  NOT EXISTS (
   select 1 
   from   payment
          inner join contract on payment.contractID = contract.contractID
          inner join room     on contract.roomID = room.roomID 
          inner join customer on customer.customerID = payment.customerID 
   where  contract.weeknum='40' 
          and payment.YearKoino='2007'
          and room.roomnum = main.roomnum  -- < correlation to main query
);

また、SQL-92 スタイルの結合についても学びます。古いスタイルの結合を行う人はもういません。

于 2012-11-21T21:11:47.233 に答える