‘壹’ 关于sql相同表分组排列组合的问题
建两个序列,并通过一个函数调用序列(union 不支持直接使用序列),用于排序。
先用第二组所有行(3行),union all 3遍第一组第一行(left join 第二组,行数就和第二组一样了)
在用第二组所有行(3行),union all 3遍第一组第二行(left join 第二组,行数就和第二组一样了)
最后按照序号,组别,编号排序
/*
dropsequenceBig_Letter1;
CreatesequenceBig_Letter1
Incrementby1
Startwith65
Maxvalue999999
Minvalue1
Nocycle
nocache;
dropsequenceBig_Letter2;
CreatesequenceBig_Letter2
Incrementby1
Startwith65
Maxvalue999999
Minvalue1
Nocycle
nocache;
--获取数列下一个值
createorreplacefunctionget_seq_next(seq_nameinvarchar2)returnnumber
is
seq_valnumber;
begin
executeimmediate'select'||seq_name||'.nextvalfromal'intoseq_val;
returnseq_val;
endget_seq_next;
*/
withtmpas(
select'1'groupid,'1'numfromal
union
select'1','2'fromal
union
select'2','1'fromal
union
select'2','2'fromal
union
select'2','3'fromal
)
selectchr(get_seq_next('Big_Letter1'))xuhao,t1.groupid,t1.num
fromtmpt1wheregroupid='2'
unionall
selectchr(get_seq_next('Big_Letter2'))xuhao,t1.groupid,t1.num
fromtmpt1,tmpt2
wheret1.groupid='1'andt1.num='1'andt2.groupid='2'
union
selectchr(get_seq_next('Big_Letter1'))xuhao,t1.groupid,t1.num
fromtmpt1wheregroupid='2'
unionall
selectchr(get_seq_next('Big_Letter2'))xuhao,t1.groupid,t1.num
fromtmpt1,tmpt2
wheret1.groupid='1'andt1.num='2'andt2.groupid='2'
orderbyxuhao,groupid,num
执行结果如下:
按照这个思路拼动态SQL吧
‘贰’ sql查询问题,一个标签表和产品表,多对多的关系,怎么查询同时关联多个标签的产品集合
用匹配查询,把标签表和查品表完全匹配,产品ID和标签ID是不是一个属性?语句如下:
Select * From 产品表 Inner Join 标签表 on 产品表.产品ID=标签表.标签ID Where 产品表.ID IS NOT NULL;
意思是把产品表和标签表里面ID字段完全对应地匹配起来,放在一个表里,这句要求你产品ID和标签ID一样,如果不一样,最起码要有点关系。比如:
表1:
ID | 字段1
----------------------
0152401 | 0000
-------------------------
0152302 | 5555
--------------------------
表2:
ID | 字段1
----------------------
52401 | 0000
-------------------------
52302 | 5555
--------------------------
表2.ID和表1.ID的关系就是:
right(表1.ID,5)=表2.ID
我相信你两个表之间一定有一个字段有关系,那就用取位函数来实现匹配吧 。
不重复出现相同的行,(要完全相同的行)就在SELECT 后面加个关键字
Distinct
语法:
Select Distinct 字段 From 表名;
‘叁’ sql语句 组合问题
你确定是所有组合吗?比如你有3个值a,b,c,那么所有组合就是3+3^2+3^3=39条记录。这其实就是笛卡尔积啊。
selecta,bfromtestunionall--一个的
selectt1.a+t2.a,t1.b+','+t2.bfromtest05t1,testt2unionall--二个的
selectt1.a+t2.a+t3.a,t1.b+','+t2.b+','+t3.bfromtestt1,testt2,testt3--三个的
结果如下: