2015-03-24 76 views
-1

我在写一个查询来总结OD矩阵表中的次数行程时遇到问题。对于使用MS Access以外的数据库,我还是个新手,所以请原谅我的经验不足。 SMGZ是带有区域数量的表格,matrix_od是矩阵表格,其中所有OD对(4109 * 4109)从区域到区域以及总体行程类型数量。我不确定这是编写此查询的最佳方式。所以我需要做的就是根据OD总结4种类型的旅行(LHDT,MHDT,HHDT,HDT_Tota)。非常感谢帮助。POSTGRES Group/Inner Join

SELECT 
    smgz.smg_zone AS "O_ID", 
    smgz.x AS "O_X", 
    smgz.y AS "O_Y", 
    smgz1.smg_zone AS "D_ID", 
    smgz1.x AS "D_X", 
    smgz1.y AS "D_Y", 
    SUM(matrix_od."LHDT") AS "LHDT_Tot", 
    SUM(matrix_od."MHDT") AS "MHDT_Tot", 
    SUM(matrix_od."HHDT") AS "HHDT_Tot", 
    SUM(matrix_od."TOT_HDT") AS "HDT_Tot" 
FROM 
    public.smgz, 
    public.matrix_od, 
    public.smgz smgz1 
GROUP BY 
    "O_ID","O_X","O_Y","D_ID","D_X","D_Y" 
INNER JOIN 
    smgz on matrix_od.O_ID = smgz.ID 
INNER JOIN 
    smgz1 on matrix_od.D_ID = smgz1.ID; 


ERROR: syntax error at or near "INNER" 
LINE 18: INNER JOIN 
     ^

********** Error ********** 

ERROR: syntax error at or near "INNER" 
SQL state: 42601 
Character: 414 
+2

连接应该在GROUP BY之前。另外,您正在执行相当笛卡尔产品 – Lamak 2015-03-24 21:42:45

+1

您正在混合隐式连接语法和显式'JOIN'运算符。不要这样做。 – 2015-03-24 21:48:46

回答

1

正如评论(FROM子句中的多个表)有明确规定的两个主要错误是,group by条款是在错误的地方,它应该是在加入之后,那你混合隐加入加入(使用join关键字)。解决方法是改变这一部分:

FROM 
    public.smgz, 
    public.matrix_od, 
    public.smgz smgz1 
GROUP BY 
    "O_ID","O_X","O_Y","D_ID","D_X","D_Y" 
INNER JOIN 
    smgz on matrix_od.O_ID = smgz.ID 
INNER JOIN 
    smgz1 on matrix_od.D_ID = smgz1.ID; 

这样:

FROM 
    public.matrix_od 
INNER JOIN 
    public.smgz on matrix_od.O_ID = smgz.ID 
INNER JOIN 
    public.smgz smgz1 on matrix_od.D_ID = smgz1.ID 
GROUP BY 
    "O_ID","O_X","O_Y","D_ID","D_X","D_Y"; 
+0

这给我一个错误smgz1只是smgz的别名ERROR:ERROR:关系“smgz1”不存在 LINE 17:smgz1 on matrix_od。“D_ID”= smgz1。“id” ^ ****** ****错误********** 错误:关系“smgz1”不存在 SQL状态:42P01 字符:394 – aconti74 2015-03-24 22:27:04

+0

@ aconti74我的不好,忘了在连接中添加别名。更新了答案。 – jpw 2015-03-24 22:27:58

0

这奏效了!谢谢@a_horse_with_no_name & @Lamak。

SELECT 
    smgz.smg_zone AS "O_ID", 
    smgz.x AS "O_X", 
    smgz.y AS "O_Y", 
    smgz1.smg_zone AS "O_ID", 
    smgz1.x AS "D_X", 
    smgz1.y AS "D_Y",  
    SUM(matrix_od."LHDT") AS "LHDT_Tot", 
    SUM(matrix_od."MHDT") AS "MHDT_Tot", 
    SUM(matrix_od."HHDT") AS "HHDT_Tot", 
    SUM(matrix_od."TOT_HDT") AS "HDT_Tot" 
FROM 
    public.matrix_od 
INNER JOIN 
    smgz on matrix_od."O_ID" = smgz."id" 
INNER JOIN 
    public.smgz smgz1 on matrix_od."D_ID" = smgz1."id" 
GROUP BY 
    smgz.smg_zone,smgz.x,smgz.y,smgz1.smg_zone,smgz1.x,smgz1.y;