ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【原】关于一条多条件SQL的写法

【原】关于一条多条件SQL的写法

原创 Linux操作系统 作者:bq_wang 时间:2008-03-04 22:14:07 0 删除 编辑

有一张多对多的表,查询时要判断出是否满足所有的记录要求
例如
1 a
1 b
1 c
2 a
2 b
3 a
如果查询a则只返回3
如果查询a、b则只返回2
如果查询a、b、c则只返回1

为了获取结果我们不太可能接受动态查询的方式,去拼凑出所有想要的查询条件,行转列当然也是一个办法,不过当行不太固定的时候,构造这个视图显然也比较困难。

为了解决这个问题,构造了一个SortSeq,该字段存储的始终是2的指数值
Create Table DimTable
(
  DimID    varchar2(20),
  SortSeq  number(20,0)
);
Create Table CrossTable
(
  SumID   varchar2(20),
  DimID   Varchar2(20)
);
INSERT INTO DimTable VALUES('A',1);
INSERT INTO DimTable VALUES('B',2);
INSERT INTO DimTable VALUES('C',4);
INSERT INTO DimTable VALUES('D',8);
INSERT INTO DimTable VALUES('E',16);
COMMIT;
INSERT INTO CrossTable VALUES('1','A');
INSERT INTO CrossTable VALUES('1','B');
INSERT INTO CrossTable VALUES('1','C');
INSERT INTO CrossTable VALUES('1','D');
INSERT INTO CrossTable VALUES('2','A');
INSERT INTO CrossTable VALUES('2','B');
INSERT INTO CrossTable VALUES('2','C');
INSERT INTO CrossTable VALUES('3','A');
INSERT INTO CrossTable VALUES('3','B');
INSERT INTO CrossTable VALUES('4','A');
COMMIT;
例如我们要查询A和C,我们只需要找到A和C所对应的SortSeq即1和4,两者相加等于5

SELECT b.SumID
  FROM DimTable a,CrossTable B
 WHERE a.DimID=b.DimID
 GROUP BY b.SumID
 HAVING SUM(a.SortSeq)=5
 
其中的奥妙在于所有2的指数相加始终是一个唯一值,正是这个唯一值保证了查询的唯一性!
最后感谢小杨同学提供的思路

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6517/viewspace-200305/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-07

  • 博文量
    412
  • 访问量
    1103079