我有连接表的问题,这里是示例表:
表A:(30行)
╔════╦════════════╦═════════════╗
║ ID ║ Name ║ Description ║
╠════╬════════════╬═════════════╣
║ 1 ║ Type ║ Unicode Art ║
║ 2 ║ Header ║ Spreadsheet ║
║ 3 ║ Auto Align ║ Off ║
╚════╩════════════╩═════════════╝
表B:(100行)
╔════╦════════════╦═════════════╦═════════╗
║ ID ║ Name ║ Description ║ TableA ║
╠════╬════════════╬═════════════╬═════════╣
║ 1 ║ Type ║ Unicode Art ║ 1 ║
║ 2 ║ Header ║ Spreadsheet ║ 1 ║
║ 3 ║ Auto Align ║ Off ║ 2 ║
╚════╩════════════╩═════════════╩═════════╝
表C :( 8000行)
╔════╦════════════╦═════════════╦═════════╗
║ ID ║ Article ║ Text ║ TableB ║
╠════╬════════════╬═════════════╬═════════╣
║ 1 ║ Type ║ Unicode Art ║ 1 ║
║ 2 ║ Header ║ Spreadsheet ║ 1 ║
║ 3 ║ Auto Align ║ Off ║ 2 ║
╚════╩════════════╩═════════════╩═════════╝
表D :( 100 000行和计数)
╔════╦═══════════╦════════════╦═════════════╦═════════╗
║ ID ║ Date ║ Clicks ║ Impressions ║ TableC ║
╠════╬═══════════╬════════════╬═════════════╬═════════╣
║ 1 ║ 20120814 ║ 10 ║ 3 ║ 1 ║
║ 2 ║ 20120815 ║ 13 ║ 5 ║ 1 ║
║ 3 ║ 20120816 ║ 15 ║ 10 ║ 2 ║
╚════╩═══════════╩════════════╩═════════════╩═════════╝
表E :( 200 000行和计数)
╔════╦═══════════╦════════════╦═══════════╦═════════╗
║ ID ║ Date ║ Views ║ Visitors ║ TableC ║
╠════╬═══════════╬════════════╬═══════════╬═════════╣
║ 1 ║ 20120814 ║ 10 ║ 3 ║ 1 ║
║ 2 ║ 20120815 ║ 13 ║ 5 ║ 1 ║
║ 3 ║ 20120816 ║ 15 ║ 10 ║ 2 ║
║ 4 ║ 20120817 ║ 8 ║ 7 ║ 2 ║
║ 5 ║ 20120818 ║ 9 ║ 4 ║ 2 ║
╚════╩═══════════╩════════════╩═══════════╩═════════╝
我用单个sql语句查询这个表:
SELECT
A.name,
A.Description,
SUM(D.clicks),
SUM(D.Impressions),
SUM(E.Views),
SUM(E.Visitors)
FROM
A
LEFT JOIN B
ON A.ID=B.TableA
LEFT JOIN C
ON B.ID=C.TableB
LEFT JOIN D
ON C.ID=D.TableC
LEFT JOIN E
ON C.ID=E.TableC
GROUP BY
A.ID
问题是查询返回表D和表E的无效SUM
但是,如果在invidual查询中查询表D和表E,我得到正确的值:
SELECT
A.name,
A.Description,
SUM(D.clicks),
SUM(D.Impressions)
FROM
A
LEFT JOIN B
ON A.ID=B.TableA
LEFT JOIN C
ON B.ID=C.TableB
LEFT JOIN D
ON C.ID=D.TableC
GROUP BY
A.ID
编辑1:
我试过RIGHT JOIN,JOIN,LEFT OUTER JOIN他们都没有工作,
当然,我可能在错误的地方使用过那些 .
但是在我得到"all included"值的第一个声明中,它们成倍增加
比它们真实的数千倍 .
2 回答
你需要弄平D和E表 . 然后我想A和B只是C的查找,所以不需要在A上进行GROUP BY:http://www.sqlfiddle.com/#!2/fccf1/8
我删除了噪音(A和B),因为我看不到(还有)A和B如何与总结C的信息有关
试试这个:
输出:
请注意,我没有't type those schema in my sqlfiddle post manually, I uses sqlfiddle' s Text to DDL
我爱http://sqlfiddle.com,它的 Text to DDL 甚至可以解析你的ASCII艺术ツ中的数据
在看到更明确的目标(来自您的评论)后,可能就是这样:http://www.sqlfiddle.com/#!2/fccf1/13
输出:
上述方法可能仍会生成笛卡尔积,在将其分类为类别(A)之前将子类别(B)展平:http://www.sqlfiddle.com/#!2/fccf1/19
输出:
表D和表E都通过表C链接到其余表 . 因此,您的第一个查询给出了表D中所有行的笛卡尔乘积,表E中的所有行,并且SUM函数聚合了此笛卡尔积 . 可能你也必须按表C分组,而不仅仅是表A.