2

現在ordered(booked)されていないテーブルからidBookが定義されているアイテムを選択する必要があります- "orders"テーブルexemplarのdateReturnフィールドがnullではありません。

テーブルordersには、同じidExemplarで以前に履行された注文を含めることができます。

エグザンプラの「orders」テーブルにdateReturned=nullのレコードが少なくとも1つある場合、このエグザンプラは除外する必要があります。

私はこのクエリを使おうとしました:

select * 
from exemplar 
join orders on orders.idExemplar=exemplar.idExemplar
where dateReturned is not null

ただし、テーブルの注文に同じidExemplarで以前に履行された注文が含まれていると、間違った結果になります。

4

4 に答える 4

3

問題を正しく理解していれば、これでうまくいくはずです。

select * 
from exemplar 
where not exists 
  ( select * 
    from orders 
    where orders.idExemplar=exemplar.idExemplar 
    and dateReturned is null )
于 2012-05-19T18:20:08.967 に答える
1

これにより、注文がnullの場合のエグザンプラのリストが返されますdateReturned order、idExemplarの注文の行は1つのみです

SELECT e.* 
FROM exemplar e 
INNER JOIN orders o
ON e.idExemplar = o.idExemplar
WHERE 
o.idExemplar IN ( 
    SELECT o.idExemplar FROM orders o 
    GROUP BY o.idExemplar 
    HAVING COUNT(o.idExemplar) = 1
) AND o.dateReturned IS NULL 

これは、where句のサブクエリを使用して、現在の注文idExemplarsが一意のidExemplarsのセットにあるかどうかを確認します。これは、各idExemplarのインスタンスをカウントし、複数回出現するインスタンスを破棄することによって行われます。

于 2012-05-19T18:26:15.190 に答える
1

外部結合について学ぶのに理想的な時期:http: //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.htmlは私のお気に入りの例の1つです

SELECT * 
FROM exemplar 
LEFT JOIN orders 
  on orders.idExemplar=exemplar.idExemplar 
WHERE dateReturned is null 

ダブルノートで少し混乱しています...しかし、あなたが言ったので、「エグザンプラがdateReturned = nullの"orders"テーブルに少なくとも1つのレコードを持っている場合、このエグザンプラは除外する必要があります!」dateReturnedがNULLの場所が必要だと思います

于 2012-05-19T18:17:47.870 に答える
1

@vizierの回答に似ていますが、表現が異なります。

1)使用NOT IN

SELECT *
FROM exemplar
WHERE idExemplar NOT IN (SELECT idExemplar FROM orders WHERE dateReturned IS NULL)

2)LEFT JOIN+を使用するWHERE IS NULL

SELECT e.*
FROM exemplar e
LEFT JOIN ON orders o ON e.idExemplar = o.idExemplar AND o.dateReturned IS NULL
WHERE o.idExemplar IS NULL
于 2012-05-19T18:37:13.413 に答える