月度归档:2011年10月

关于 cross join (交叉连接)和 natural join(自然连接)

1. cross join 就是笛卡尔积

那看起来好象和 inner join 是一样的,在 SQL 标准中定义的是 cross join 就是没有条件的 inner join。在 mysql 中,不区分,这两个等价。
2. natural (left) join 是把两个表名字一样的列,做相等条件处理,比如:
t1
id1 name
t2
id2 name
那么 select t1.id1, t2.id1, t1.name from t1 natural join t2 就等价
select t1.id1, t2.id1, t1.name from t1 join t2 on (t1.name = t2.name)
自动把一样名称的列(name)做了个相待条件处理,多列也会同时处理。
所以,这两种 join 没人用是有原因的。
cross join 没意义,一般用逗号就可以了。
natural 降低了可读性,不建议使用。

关于 H2DB 的好,我个人表示无语。

                一个好软件,会让人觉得赏心悦目

                 会让人心旷神怡
                 会开心
                 会……
H2DB 就是这样的一个好软件,就一个感觉—-舒服!
比如:group by sort 的实现

    private void queryGroupSorted(int columnCount, ResultTarget result) {

        int rowNumber = 0;

        setCurrentRowNumber(0);

        Value[] previousKeyValues = null;

        while (topTableFilter.next()) {

            setCurrentRowNumber(rowNumber + 1);

            if (condition == null || Boolean.TRUE.equals(condition.getBooleanValue(session))) {

                rowNumber++;

                Value[] keyValues = new Value[groupIndex.length];

                // update group

                for (int i = 0; i < groupIndex.length; i++) {

                    int idx = groupIndex[i];

                    Expression expr = expressions.get(idx);

                    keyValues[i] = expr.getValue(session);

                }

                if (previousKeyValues == null) {

                    previousKeyValues = keyValues;

                    currentGroup = New.hashMap();

                } else if (!Arrays.equals(previousKeyValues, keyValues)) {

                    addGroupSortedRow(previousKeyValues, columnCount, result);

                    previousKeyValues = keyValues;

                    currentGroup = New.hashMap();

                }

                currentGroupRowId++;

                for (int i = 0; i < columnCount; i++) {

                    if (groupByExpression == null || !groupByExpression[i]) {

                        Expression expr = expressions.get(i);

                        expr.updateAggregate(session);

                    }

                }

            }

        }

        if (previousKeyValues != null) {

            addGroupSortedRow(previousKeyValues, columnCount, result);

        }

    }

看着太舒服了。