1

私は2つのテーブルを持っていPersonますInterest

Personテーブル構造

Id | Name

Interestテーブル構造

Id | Person Id | Interest Category

私の質問は、「音楽」と「映画」と「スポーツ」のカテゴリが好きな人をどうやって取得するかです。カテゴリは動的になります。

したがって、IN演算子を使用するのが好きですが、IN演算子でOR条件ではなくAND条件を使用します。

SELECT `Person Id` FROM Interest
WHERE `Interest Category` IN ('music', 'movie', 'sport');
4

3 に答える 3

3

を使用できますHAVING COUNT。数も動的でなければなりません。

SELECT person_id
FROM interest
WHERE interest_category IN ( 'music', 'movie', 'sport');
GROUP BY person_id
HAVING COUNT(*) = 3;
于 2012-05-30T09:23:58.037 に答える
2
SELECT DISTINCT p.id
FROM Person p
JOIN Interest i1 ON p.id = i1.person_id AND i1.interest_category = 'music'
JOIN Interest i2 ON p.id = i2.person_id AND i2.interest_category = 'movie'
JOIN Interest i3 ON p.id = i3.person_id AND i3.interest_category = 'sport'
于 2012-05-30T09:15:39.707 に答える
0

これを試して


SELECT DISTINCT DECODE(A.RES, B.RES, I.INTEREST_CATEGORY, 'FALSE') AS FINAL_RES
  FROM INTEREST I,
       TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')),
       (SELECT LENGTH(WM_CONCAT(COLUMN_VALUE)) AS RES
          FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport'))) A,

   (SELECT LENGTH(WM_CONCAT(DISTINCT I.INTEREST_CATEGORY)) AS RES
      FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')),
           INTEREST I
     WHERE I.INTEREST_CATEGORY = COLUMN_VALUE) B

WHERE I.INTEREST_CATEGORY = COLUMN_VALUE

このクエリには2つの部分があります


(SELECT LENGTH(WM_CONCAT(COLUMN_VALUE)) AS RES
          FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')))
これは、入力として提供された値の長さを計算します

2番目のクエリ


(SELECT LENGTH(WM_CONCAT(DISTINCT I.INTERESET_CATEGORY)) AS RES
          FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')),
               INTEREST I
         WHERE I.INTEREST_CATEGORY = COLUMN_VALUE)
データベースエントリと一致するカテゴリの長さを計算します。

次に、これら2つの長さが最終的に比較され、IDが返されます。

これを行うには非常に長い道のりですが、group by(はるかに小さいコーディング)を使用したくない場合は、これがクエリのメソッドになる可能性があります。

それが役に立てば幸い

于 2012-05-30T11:03:03.667 に答える