1

我有下表(简化,删除了不需要的列):

包交易

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

我想查询所有没有 subscriptionType= 101的记录,但只有那些subscriptionType= 101的记录相同的记录memberID存在。

因此,我使用:

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 回答