我试图做一个在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
有什么想法吗?