我有下表(这是一个bannerid列表和每个的可用大小):
bannerid, bannersize
--------------------
1, 16
1, 32
1, 128
2, 16
2, 32
2, 128
2, 256
2, 512
3, 16
3, 32
3, 64
3, 128
3, 256
3, 512
3, 1024
我需要能够生成所有可能大小的所有bannerid的列表(16,32,64,128,256,512,1024)
所以在这个例子中,结果应该是:
bannerid
--------
3, 16
3, 32
3, 64
3, 128
3, 256
3, 512
3, 1024
由于bannerid 3具有上述所有可能的大小(1和2缺少几个大小)。
实现这一目标的好方法是什么?我假设有一种比在同一个表上进行7次连接并检查每种可能的大小组合都更好的方法。
我还想要一种方法来控制显示哪个bannerid:(a)匹配所有尺寸的那些,或者(b)按照我的指定匹配某些尺寸。
答案 0 :(得分:4)
试试这个:
select b.* from banners b inner join
( select bannerid,count(bannersize) bl from banners
group by bannerid
having count(bannersize) = (select count(distinct(bannersize)) cl from banners) ) ab
on b.bannerid=ab.bannerid
您也可以在Sqlfiddle
上试用答案 1 :(得分:1)
如果您使用的是SQL Server 2005+(或Oracle 11g +),则可以使用PIVOT
查询:
select * from banner
pivot (count(bannersize) for bannersize in ([16], [32], [64], [128], [256], [512], [1024])) as bann
where [16] > 0 and [32] > 0 and [64] > 0 and [128] > 0 and [256] > 0 and [512] > 0 and [1024] > 0
给你输出:
BANNERID 16 32 64 128 256 512 1024 3 1 1 1 1 1 1 1
你可以通过modyfing where
子句实现'(b)按照我的指定匹配一些大小。
此输出与请求不同,但您可以通过将此查询用作子查询来“修复”它:
select * from banner
where bannerid in
(
select bannerid from banner
pivot (count(bannersize) for bannersize in ([16], [32], [64], [128], [256], [512], [1024])) as bann
where [16] > 0 and [32] > 0 and [64] > 0 and [128] > 0 and [256] > 0 and [512] > 0 and [1024] > 0
)
答案 2 :(得分:0)
问:我的表格......是一个标榜列表和每个标识的可用尺寸。 我需要能够生成包含所有标题的所有bannerid的列表 可能的尺寸。
答:听起来你只想要表中的所有内容:)
select * from mytable order by bannerid
如果您希望排除表中的其他列,则:
select bannerid, bannersize from mytable order by bannerid
如果您只想要一个bannerid的可用尺寸(例如“3”),那么
select bannerid, bannersize from mytable where bannerid = 3
如果您想要某些特定标志的可用尺寸(例如“1”和“3”),那么
select bannerid, bannersize from mytable where bannerid in (1, 3)