apache点燃跨缓存查询 - 无法解析sql

时间:2016-09-13 08:30:18

标签: ignite

我试图做一个在2个类之间有内部子查询的查询。但每次我尝试它,它给我一个SQL解析错误。 因此,为了找出问题,我做了一个非常基本的跨缓存查询,它给了我相同的解析错误。有什么想法吗?

CacheConfiguration<Integer, MyClass1> cfg = new CacheConfiguration<>("class1Cache");
cfg.setIndexedTypes(Integer.class, MyClass1.class);

IgniteConfiguration ignitionConfig = new IgniteConfiguration();
ignitionConfig.setCacheConfiguration(cfg);

Ignite ignite = Ignition.getOrStart(ignitionConfig);

IgniteCache<Integer, MyClass1> cache = ignite.getOrCreateCache(cfg);

StringBuilder builder = new StringBuilder();

builder.append(" SELECT ");
builder.append("    c.name ");
builder.append(" FROM  ");
builder.append("    MyClass1 c,  \"class2Cache\".MyClass2 b  ");
builder.append(" WHERE  ");
builder.append("    c.name = b.name   ");


SqlFieldsQuery qry = new SqlFieldsQuery(builder.toString());

// Execute the query and obtain the query result cursor.
List<List<?>> res = cache.query(qry).getAll();

所以我通过添加:

获得了基本的SQL工作
cfg.setCacheMode(CacheMode.REPLICATED);

但仍无法使我的内部子查询起作用。

builder.append(" SELECT ");
builder.append("    COALESCE(SEL1.NAME, SEL2.NAME) AS NAME, ");
builder.append("    COALESCE(SEL1.ACCOUNT, SEL2.ACCOUNT) AS ACCOUNT, ");
builder.append("    SEL1.TOTAL_POS, SEL2.TOTAL_NEG, LEAST(TOTAL_POS, TOTAL_NEG) AS LBS,  ");
builder.append("    RESULT.PERIOD,   ");
builder.append("    (LBS/PERIOD) * 100 AS TOTAL_RESULT   ");
builder.append(" FROM  ");

builder.append("    (  ");
builder.append("        SELECT  ");
builder.append("            ACCOUNT, TYPE, SUM(ITEM*COST) AS TOTAL_POS, NAME  ");
builder.append("        FROM  ");
builder.append("            MyClass1 ");
builder.append("        WHERE  ");
builder.append("            NAME = ?  ");
builder.append("        AND  ");
builder.append("            TYPE = 'Buy'  ");
builder.append("        GROUP BY  ");
builder.append("            TYPE  ");
builder.append("    ) AS SEL1,  ");

builder.append("    (  ");
builder.append("        SELECT  ");
builder.append("            ACCOUNT, TYPE, SUM(ITEM*COST) AS TOTAL_NEG, NAME ");
builder.append("        FROM  ");
builder.append("            MyClass1 ");
builder.append("        WHERE  ");
builder.append("            NAME = ?  ");
builder.append("        AND  ");
builder.append("            TYPE = 'Sell'  ");
builder.append("        GROUP BY  ");
builder.append("            TYPE  ");
builder.append("    ) AS SEL2  ");


builder.append("    (  ");
builder.append("        SELECT  ");
builder.append("            AVG(B.D_REC) AS PERIOD, account, NAME  ");
builder.append("        FROM  ");
builder.append("        (  ");
builder.append("            SELECT  ");
builder.append("                SUM(PRICE) AS D_REC, DATE, account, NAME ");
builder.append("            FROM  ");
builder.append("            (  ");
builder.append("                SELECT  ");
builder.append("                    b.NAME, b.account, b.PRICE, b.DATE");
builder.append("                FROM  ");
builder.append("                    class2cache.MyClass2 b ");
builder.append("                WHERE  ");
builder.append("                    b.NAME = ?  ");
builder.append("            ) A  ");
builder.append("        GROUP BY  ");
builder.append("            DATE, ACCOUNT, NAME ");
builder.append("        ) B  ");
builder.append("        GROUP BY ");
builder.append("            ACCOUNT, NAME ");
builder.append("    ) AS RESULT  ");
builder.append(" WHERE  ");
builder.append("    SEL1.ACCOUNT = SEL2.ACCOUNT  ");
builder.append(" AND  ");
builder.append("    RESULT.ACCOUNT = SEL1.ACCOUNT  ");

编辑:所以我的SQL失败了,因为它似乎无法让我得到聚合字段的结果:

(LBS/PERIOD) * 100 AS TOTAL_RESULT

如果我做一些随机计算,它就会起作用

(20/10) *100 AS TOTAL_RESULT

有什么想法吗?

0 个答案:

没有答案