1

次の問題点を教えてください:(行が返されませんでした)

 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 )
4

2 に答える 2

2

これには結合構文が必要です。おそらく、あなたは学期が表のどの学期とも似ていないクラスを見つけようとしています。最初に一致するものを見つけてから、次を使用してこれらを除外し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
                  )
于 2012-12-27T16:44:56.423 に答える
0

どちらも奇妙ですが、これらは2つの異なるクエリです。私はすべてのクラスに学期があると思います。適切な外部キー制約がある場合、sem最大でnull、になる可能性があります。その場合、クエリは次のようになります。

select * 
from class 
where sem is null

semただし、2番目のクエリは機能し、テーブルにない値を持つすべてのクラスを返す必要がありますsemester

ただし、に複数のレコードがあるとすぐに最初のクエリは失敗しsemesterます。また、(おそらく)数値フィールドで文字列比較を行います。全体として、その最初のクエリは意味がありません。

于 2012-12-27T16:43:05.473 に答える