1

次の表があります(簡略化され、不要な列が削除されました):

パッケージトランザクション

| memberID  |  subscriptionType |
| ==========|===================|
| 12345     |  101              |
| 12345     |  203              |
| 12346     |  101              |
| 12347     |  101              |
| 12348     |  101              |
| 12348     |  203              |
| 12349     |  203              |
| 12345     |  205              |

= 101を持たない すべてのレコードを照会したいのですが、同じレコードに対して= 101のレコードが存在するレコードのみを照会します。subscriptionTypesubscriptionTypememberID

したがって、私は使用します:

SELECT memberID, subscriptionType
  FROM packageTransactions
 WHERE memberID IN
    ( SELECT memberID
        FROM packageTransactions
       WHERE subscriptionType = '101'
    )
   AND subscriptionType <> '101'
;

これにより、探している結果セットが得られます。

| memberID  |  subscriptionType |
| ==========|===================|
| 12345     |  203              |
| 12348     |  203              |
| 12345     |  205              |

ただし、数千レコード (私の場合は +30k) のテーブルでこのクエリを使用すると、結果を返すのに数分かかります。

だから、データをクエリするための「より良い」 /より効率的な方法があるのだろうか?

4

2 に答える 2

1

これがSQLFiddleのデモです

select t.* from packageTransactions t
join
(
  select distinct memberID 
    from packageTransactions
  where subscriptionType = 101 
) t1 on t.memberId= t1.memberId
where
  (subscriptionType <> 101)
于 2012-12-20T08:31:12.240 に答える
1

これを試して :

SELECT pt2.memberID, pt2.subscriptionType
FROM packageTransactions pt1 inner join packageTransactions pt2 
   ON pt1.memberID = pt2.memberID  
WHERE 
  pt1.subscriptionType = '101' AND pt2.subscriptionType <> '101'

;
于 2012-12-20T08:19:43.747 に答える