交叉表(Cross Table)的基本特點是具有橫縱兩個自由延展的維度,而平面表結構只有一個可延展的維度,因為平面表的列名和列數是確定的。例如,地區的產品銷售數量,在平面表中表達為
district_id product_id sell_num
如果表現為交叉表,則為
productA productB
districtA sellNum sellNum
districtB sellNum sellNum
這種結構上的失配需要通過程序邏輯來進行調整。
注意到平面表結構只具有一個可延展的維度,而join可以看作是該維度上的連接操作。因此我們可以將交叉表看作是多個簡單平面表結構并置的結果。即分解為
A:
productA
districtA sellNum
districtB sellNum
B:
productB
districtA sellNum
districtB sellNum
橫向維度的擴展在程序中表達。
SqlInfo結構封裝了這種簡單平面表的分解片斷。
class SqlInfo{
List fieldNames;
SQL sql;
String keyField;
}
我們在程序中通過JoinBuilder來實現橫向維度的構造
JoinBuilder.begin(sqlInfoA)
.join(sqlInfB)
.leftJoin(sqlInfoC)
.end();
生成的sql語句示例如下
select sqlInfoA.fieldNames, sqlInfoB.fieldNames
from sqlInfoA.sql join sqlInfoB.sql
on sqlInfoA.keyField = sqlInfoB.keyField