MySQL 除法問題

神諭丶發表於2014-08-21
此處用到了Pivoting技術
注:Pivoting技術是指一種可以把行轉換為列的技術,在Pivoting的執行過程中可能會用到聚合。
這裡討論的都是靜態Pivoting查詢,即使用者需要提前知道旋轉的屬性列的值,對於動態Pivoting,需要動態地構造查詢字串。


關係除法問題的解決方案:
(當除數集合中的元素數量較小時,Pivoting可以用於解決關係除法問題)


  1. create table devision(
  2. orderid varchar(10) not null,
  3. productid int not null,
  4. primary key(orderid,productid));


  1. insert into devision select 'A',1;
  2. insert into devision select 'A',2;
  3. insert into devision select 'A',3;
  4. insert into devision select 'A',4;
  5. insert into devision select 'B',2;
  6. insert into devision select 'B',3;
  7. insert into devision select 'B',4;
  8. insert into devision select 'C',3;
  9. insert into devision select 'C',4;
  10. insert into devision select 'D',4;


解釋一下:
表devision儲存訂單中包含的產品,比如A訂單所包含的產品ID為1、2、3、4,C訂單所包含的產品ID為3、4,以此類推
Pivoting技術可以把每個訂單中的產品旋轉到單獨的列之中。
比如需要查詢productid為2、3、4的訂單,可以採用以下方法:



  1. select orderid
  2. from(select orderid,
  3.     max(case when productid=2 then 1 end) as p2,
  4.     max(case when productid=3 then 1 end) as p3,
  5.     max(case when productid=4 then 1 end) as p4
  6.     from devision
  7.     group by orderid
  8.     ) p
  9. where p2=1 and p3=1 and p4=1;

得到的結果很顯然:



因為只有A和B訂單包含產品ID為2、3、4的產品

上sql語句中的派生表P輸出結果為:





如果將生成派生表p的語句中的max函式改成count函式,則更加直觀:
及若產品存在則返回為1,不存在則返回為0,而不是null。



    1. select orderid
    2. from(select orderid,
    3.     count(case when productid=then 1 end) as p2,
    4.     count(case when productid=then 1 end) as p3,
    5.     count(case when productid=then 1 end) as p4
    6.     from devision
    7.     group by orderid
    8.     ) p
    9. where p2=and p3=and p4=1;





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-1255297/,如需轉載,請註明出處,否則將追究法律責任。