Select 行满足一组动态 ID

Select rows that meet ALL of a dynamic set of ids

我有一个 table,我希望能够查询它以获取定义值集中的行。如果需要,我可以创建新的 table 结构,因为这是用于各种排行榜的临时数据。

令牌集可以通过将许多令牌组合在一起来创建。我想做的是找到定义集中具有所有标记的所有地址。

不确定我是否需要重新建模数据,或者我是否只是缺少一个简单的查询设置。

所以在下面的数据中,我想 return 基于 TokenSet“SetA”的地址 1234。

代币地址

TokenID Address
AA 1234
BB 1234
CC 1234
DD 1234
AA 4321
CC 4321

令牌集

TokenID Set
AA SetA
BB SetA
CC SetA

如果集合和地址包含 non-repeated 个 tokenID,您可以:

select a.address
from token_sets s
join token_address a on a.tokenid = s.tokenid
where s.set = 'SetA'
group by a.address
having count(*) = (select count(*) from token_sets where set = 'SetA')

这是经典Relational Division有很多不同的解决方案。

如果您想同时跨多个集合执行此操作,一种方法是使用 window 函数

SELECT
  ts.[Set],
  ta.Address
FROM TokenAddress ta
JOIN (
    SELECT *,
      Total = COUNT(*) OVER (PARTITION BY ts.[Set])
    FROM TokenSet ts
) ts ON ta.TokenID = ts.TokenID
GROUP BY
  ts.[Set], ta.Address
HAVING COUNT(*) = MIN(ts.Total);

SQL Fiddle