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);
我有一个 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);