这是最好的时代,这是最坏的时代,这是智慧的时代,这是愚蠢的时代;这是信仰的时期,这是怀疑的时期;这是光明的季节,这是黑暗的季节;这是希望之春,这是失望之冬;人们面前有着各样事物,人们面前一无所有;人们正在直登天堂;人们正在直下地狱。
我也要与时俱进了,被itpub2.0牵着尾巴,拼命的奔跑,不停的灌水...
【原】关于一条多条件SQL的写法
上一篇 /
下一篇 2008-03-04 22:14:07
/ 个人分类:数据库专区
查看( 67 ) /
评论( 14 )
有一张多对多的表,查询时要判断出是否满足所有的记录要求
K}^uj0例如ITPUB个人空间Fv4qO lC)Us
1 aITPUB个人空间oh:B
Zs
1 bITPUB个人空间,f6c!g#X@)kG@
1 cITPUB个人空间Z5_F_4O
S
?)g
2 aITPUB个人空间:j+S4xl @$U&y/I
2 bITPUB个人空间D.~6R
{0P$Ssdd
3 a
ZMDL(TGC Ho0如果查询a则只返回3ITPUB个人空间+`8K+Wd5t:E?
如果查询a、b则只返回2ITPUB个人空间R8aK0]3mV
如果查询a、b、c则只返回1
为了获取结果我们不太可能接受动态查询的方式,去拼凑出所有想要的查询条件,行转列当然也是一个办法,不过当行不太固定的时候,构造这个视图显然也比较困难。
为了解决这个问题,构造了一个SortSeq,该字段存储的始终是2的指数值
6y"yxo D%Yh0Create Table DimTableITPUB个人空间"T?`P5l5}
(
bI"SS9f"Vu0 DimID varchar2(20),ITPUB个人空间.hz}a*w.~JZ
SortSeq number(20,0)ITPUB个人空间(b$Nq0g*{G9mk&I
);ITPUB个人空间(r {kc MVa/h
Create Table CrossTable
JJn/NA(@2o0(
-m1K]f#|D0 SumID varchar2(20),
6a
u
M"B*iZd$E`/E0 DimID Varchar2(20)
3C8W8I+O'b9lF0);
z,m\*D*PJ%LA0INSERT INTO DimTable VALUES('A',1);
M^GT/mc
y+ugA0INSERT INTO DimTable VALUES('B',2);
hU`?LI+I0INSERT INTO DimTable VALUES('C',4);
'^'buP%X%u;?*Lv3^0INSERT INTO DimTable VALUES('D',8);
3JQ]Y/x0y0INSERT INTO DimTable VALUES('E',16);
Fs_[#\(e0COMMIT;
7E/BEI(['s0INSERT INTO CrossTable VALUES('1','A');ITPUB个人空间*]Ft~uyk/@r\i
INSERT INTO CrossTable VALUES('1','B');
9};u i3?9f)n'F$Jb!Z0INSERT INTO CrossTable VALUES('1','C');
$oV5j
xPiaR0W0INSERT INTO CrossTable VALUES('1','D');
V#E#N9y5Zw%P
O0INSERT INTO CrossTable VALUES('2','A');
;C~v2x^I-Z@0INSERT INTO CrossTable VALUES('2','B');ITPUB个人空间'Y%H9|]Q
N+NF
K
}
INSERT INTO CrossTable VALUES('2','C');ITPUB个人空间f
i/}B g
_nX~
INSERT INTO CrossTable VALUES('3','A');
"Q;}CS_T'UjA0INSERT INTO CrossTable VALUES('3','B');ITPUB个人空间Q0S
kE3o;Y
INSERT INTO CrossTable VALUES('4','A');ITPUB个人空间Fbs$~KMQB
COMMIT;
K%VT,g$s0t4o6E0例如我们要查询A和C,我们只需要找到A和C所对应的SortSeq即1和4,两者相加等于5
SELECT b.SumIDITPUB个人空间x],X1K@q+}
FROM DimTable a,CrossTable BITPUB个人空间5cr;K
VR8Q
WHERE a.DimID=b.DimIDITPUB个人空间c:v5}}+~MFoG
GROUP BY b.SumIDITPUB个人空间$x`#n,t8~%~5_KR:Q!w/A
HAVING SUM(a.SortSeq)=5
,? f"a{[~0
tX
RM Zr0j&x*?0其中的奥妙在于所有2的指数相加始终是一个唯一值,正是这个唯一值保证了查询的唯一性!