2012-04-19 11 views
2

私は顧客、製品、および取引テーブルで構成されるデータベースを持っています。SQL Datetimeが等しくない。

私は年に何の取引を行わなかったそれらの顧客のために、すべての顧客の名前とSSNのをリストするSQL文を記述しようとしている2000年

トランザクションテーブルのTransactionDate列には、日付/時刻でありますデータタイプ(例えば、2000-12-18 00:00:00)。

これは私が書いたSQLコードです:

SELECT DISTINCT CustomerName, Customer.CustomerSSN 
FROM Customer, Transaction 
WHERE Customer.CustomerSSN=Transaction.CustomerSSN 
AND YEAR(TransactionDate)<>2000; 

記号(<>)と等しくないが何らかの理由で機能していないようです。私はそれを等号に変更すると正しい結果を返します...

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

+4

'not working'を定義します。年<> 2000年のレコードがありますか? –

+1

SQLクエリのロジックが、問題の文と一致しません。 2000 *にトランザクションを持っていても、2000 *以外のトランザクションを持つ顧客を返します(あなたが望むものではありません)。以下の答えはあなたが望む結果を得るすべての方法です。 –

答えて

4

私はアプローチを変更したいと思います。

次のクエリでは、顧客レコードが複数のトランザクションレコードに結合されていないため、distinctまたはGROUP BYは必要ありません。

これはAny取引を一度も行っていないお客様にも有効です。

最後に、YEAR()=2000ではなく>= AND <を使用します。これにより、フルスキャンではなくインデックスの検索が可能になります(トランザクションテーブルに適切なインデックスがあることを前提とします)

SELECT 
    CustomerName, 
    CustomerSSN 
FROM 
    Customer 
WHERE 
    NOT EXISTS (
    SELECT * 
     FROM Transaction 
    WHERE CustomerSSN  = Customer.CustomerSSN 
     AND TransactionDate >= '20000101' 
     AND TransactionDate < '20010101' 
) 
+0

完璧、ありがとう – user994585

2
SELECT DISTINCT 
    Customer.CustomerName, 
    Customer.CustomerSSN 
FROM Customer 
LEFT JOIN Transaction 
    ON Customer.CustomerSSN=Transaction.CustomerSSN 
    AND YEAR(TransactionDate) = 2000 
WHERE Transaction.TransactionDate IS NULL 

このクエリは、しかしTransactionsからのパッチの記録を持っていない任意の顧客は、それゆえ、その年に何のトランザクションがなかった2000年から、具体的Transactions参加し、顧客に取引に参加します。したがって、あなたが探しているTransaction.TransactionDate IS NULL

あなた自身のクエリでは、単に2000年ではない年にトランザクションを持っていた顧客を見つけるだけですが、2000年以内にトランザクションもあったかもしれません。

1
SELECT CustomerName, CustomerSSN 
FROM Customer 
WHERE CustomerSSN NOT IN (
SELECT CustomerSSN 
FROM Transaction 
WHERE Year(TransactionDate)=2000); 
+2

'Where TransactionDate = 2000'は動作しません。 'YEAR(TransactionDate)= 2000'をコピーすることを意味しましたか?もしそうなら、SARGableではないことにも注意してください。 – MatBailie

+0

良い点、私は答えを修正しました。 –

0

私はその解決が、それでも(他の人に役立つかもしれない)、ここで追加の答えとしてこれを投稿したい知っています。

これを代替的に修正する方法は、元のクエリの変更を最小限に抑えたNULLIF演算子を使用することです。<が機能しない場合は、より良い置換と見なします。

SELECT DISTINCT CustomerName, Customer.CustomerSSN 
FROM Customer, Transaction 
WHERE Customer.CustomerSSN=Transaction.CustomerSSN 
AND (NULLIF(YEAR(TransactionDate), 2000) IS NOT NULL) 
関連する問題