2017-09-21 4 views
0

に一致する値を持っていないレコードを検索することができますどのように私はこれらのSQLステートメントを持って参加しましたテーブル

SELECT COUNT(*) FROM Phrase -- Returns 660 rows 

SELECT COUNT(*) FROM Score -- Returns 660 rows 

SELECT count(*)    -- Returns 660 rows 
FROM Score AS S 
JOIN Phrase AS P ON S.PhraseId = P.PhraseId 

SELECT count(*)    -- Returns 658 rows   
FROM Score AS S 
JOIN Phrase AS P ON S.PhraseId = P.PhraseId 
JOIN Category AS C ON P.CategoryId = C.Id 

私は、データベースに何が悪かったのかうまくしようとしていますし、どのようにいくつかのアドバイスをいただければ幸いですテーブルにないcategoryIdがフレーズにあるレコードの句が見つかりました。カテゴリ

+0

SQLとしてライトを取得するには、ネストされたサブクエリを使用することができ、あなたはそれが左を使用すると、労働組合に加入するエミュレートするか/いないに存在して使用する必要がありますどちらか。 – xQbert

答えて

1

は、外部結合を使用します。一致スコアとフレーズから

戻るすべてのレコードを。一致するカテゴリの行を含めます。カテゴリに一致したものをすべて除外し、カテゴリに一致しないスコア/フレーズの2つのレコードを残します。

SELECT * 
FROM Score AS S 
JOIN Phrase AS P ON S.PhraseId = P.PhraseId 
LEFT JOIN Category AS C ON P.CategoryId = C.Id 
WHERE C.ID is null 

効率的ではない/存在しませんが、返される列に柔軟性があります。

2

PhraseテーブルでそのようなIDを見つけるには、NOT EXISTSを使用してください。

SELECT * FROM Phrase AS P 
    WHERE NOT EXISTS (SELECT 1 FROM Category WHERE P.CategoryId = C.Id) 

別の解決策は、間の参照整合性制約があると仮定すると、私はあなたが区分= NULLで2本のフレーズの記録を持っていると思いますが、可能性のNULL

SELECT * FROM Phrase AS P 
    WHERE P.CategoryId NOT IN(SELECT C.Id FROM Category WHERE C.Id IS NOT NULL) 
1

詳細注意する必要がありますしかしNOT INを使用することですフレーズとカテゴリ。

とにかく、これは、これらの2フレーズレコードを一覧表示する必要があります。

SELECT * FROM Phrase WHERE CategoryId NOT IN (SELECT Id FROM Category) 
1

使用は完全外部結合をサポートしていません。この

select count(*) 
from score as S 
where phraseId in 
(select phraseId 
    from Phrase 
    where phaseId not in (select phraseId from category); 
関連する問題