0

シナリオは次のとおりです。

次のようなテーブルがあります。

テーブル名: USER_ACTIVITIES

USER_ID | ACTIVITY_CODE
-----------------------
1111    |  013
-----------------------
1111    |  112
-----------------------
2222    |  014
-----------------------
3333    |  028
-----------------------
3333    |  245
-----------------------
3333    |  468
-----------------------
4444    |  079
-----------------------
4444    |  028
-----------------------
5555    |  157
-----------------------
5555    |  523
-----------------------
6666    |  081
-----------------------
7777    |  067
-----------------------
7777    |  624
-----------------------

これは MySQL を使用した Oracle データベースであり、ACTIVITY_CODE は CHAR フィールドです。ACTIVITY_CODE が 0 で始まり、ACTIVITY_CODE が他の番号で始まっていない USER_ID を抽出する必要があります。

そう、

WHERE ACTIVITY_CODE LIKE '0%'

ACTIVITY_CODE が 0 で始まるすべての USER_ID が表示されますが、アクティビティ コードが 0 で始まる USER_ID と、他の数字で始まる ACTIVITY_CODE も含まれます。

ACTIVITY_CODE が 0 から始まるユーザーだけを返すにはどうすればよいですか?

単一のクエリである必要があり (サブクエリは問題ありません)、ビューを作成できません。

それはできますか?

4

2 に答える 2

0

「Not in」を介して正規表現を使用してこれを行うこともできます。

select distinct user_id from user_activities
  where activity_code like '0%'
    and user_id not in (select user_id 
                          from user_activities 
                          where activity_code REGEXP '^[1..9]')

SQL フィドル

帰りに帽子をかぶると、Activity_code で最小/最大 ASCII ソートを実行することもできます。これは、0 を埋め込んだためです。

したがって、これは可能な限り最も単純なクエリになります。

select user_id from user_activities
  group by user_id
  having min(activity_code) like '0%'
    and max(activity_code) like '0%';

2 番目の SQL Fiddle の例

于 2013-07-11T02:36:06.880 に答える
0

条件に一致しないユーザーを除外するには、LEFT JOIN を使用します。

SELECT user_id
FROM user_activities ua1
LEFT JOIN (SELECT DISTINCT user_id
           FROM user_activities
           WHERE activity_code NOT LIKE '0%') ua2
ON ua1.user_id = ua2.user_id
WHERE ua1.activity_code LIKE '0%'
AND ua2.user_id IS NULL
于 2013-07-11T02:30:36.243 に答える