次の問題点を教えてください:(行が返されませんでした)
Select *
from class
where sem NOT LIKE concat('%',(Select sem_id from semester ),'%')
私はこれに次のトリックがうまく機能している原因を尋ねました:(8行が返されました)
Select *
from class
where sem NOT IN (Select sem_id from semester )
次の問題点を教えてください:(行が返されませんでした)
Select *
from class
where sem NOT LIKE concat('%',(Select sem_id from semester ),'%')
私はこれに次のトリックがうまく機能している原因を尋ねました:(8行が返されました)
Select *
from class
where sem NOT IN (Select sem_id from semester )
これには結合構文が必要です。おそらく、あなたは学期が表のどの学期とも似ていないクラスを見つけようとしています。最初に一致するものを見つけてから、次を使用してこれらを除外しhaving
ます。
Select c.*
from class c left outer join
semester s
on c.sem like concat('%', s.sem_id, '%')
group by c.class_id
having max(s.sem_id) is null -- there are no matching semesters
group by
次のようにクエリを作成することで、を削除できます。
Select c.*
from class
where not exists (select s.sem_id
from semester s
where class.sem like ('%', s.sem_id, '%')
limit 1
)
どちらも奇妙ですが、これらは2つの異なるクエリです。私はすべてのクラスに学期があると思います。適切な外部キー制約がある場合、sem
最大でnull
、になる可能性があります。その場合、クエリは次のようになります。
select *
from class
where sem is null
sem
ただし、2番目のクエリは機能し、テーブルにない値を持つすべてのクラスを返す必要がありますsemester
。
ただし、に複数のレコードがあるとすぐに最初のクエリは失敗しsemester
ます。また、(おそらく)数値フィールドで文字列比較を行います。全体として、その最初のクエリは意味がありません。