SQL Inner Join给出了错误的结果

时间:2012-03-01 23:32:17

标签: sql ms-access

我知道答案是非常简单的,我之前已经解决了这个问题,但由于某种原因,我已经坚持了一个小时。

我有以下查询:

SELECT table1.FIELD1, table2.sum(FIELD2), table3.sum(FIELD3)
FROM (table1 INNER JOIN table2 ON table1.JOBINSTID = table2.JOBINSTID)
     INNER JOIN table3 ON table1.JOBINSTID = table3.JOBINSTID
GROUP BY FIELD1;

它返回的结果完全是疯子。而不是给我Field2的实际总和,它给了我一个WAYYY更高的数字。我知道为什么会发生这种情况并且有点理解它但我不知道如何解决它。如何更改此查询以便获得正确的总和?

编辑: JOBINSTID是表1和表2中的唯一ID,但不在表3中。

3 个答案:

答案 0 :(得分:1)

如果只是涉及table1的多对一问题,您可能需要这样:

SELECT
  table2.FIELD1,
  SUM(table3.FIELD2)
FROM table2 JOIN table3
ON table3.JOBINST_ID = table2.JOBINSTID
WHERE EXISTS (
  SELECT * FROM table1
  WHERE table1.JOBINSTID = table2.JOBINSTID
  -- AND table1.JOBINSTID = table3.JOBINST_ID -- redundant, but might improve runtime
)
GROUP BY table2.FIELD1;

如果问题是(也)在table2和table3之间,你可能需要重新考虑数据库的规范化程度,但是你可以试试这个,我认为无论如何都会这样:

SELECT -- DISTINCT -- add DISTINCT if FIELD1 values are not unique in table2
  table2.FIELD1,
  (
    SELECT SUM(FIELD2) FROM table3
    WHERE table3.JOBINST_ID = table2.JOBINSTID
  )
FROM table2
WHERE EXISTS (
  SELECT * FROM table1
  WHERE table1.JOBINSTID = table2.JOBINSTID
)

鉴于你所说的,很难说你想要什么,因为你没有描述哪些关系是1-1,哪些是多-1,或者说明哪些列在哪些表中是唯一的。

答案 1 :(得分:0)

试试这个。它应该可以工作。

SELECT FIELD1, sum(FIELD2)
FROM table1 t1,table2 t2,table t3
WHERE.t1.JOBINSTID = t2.JOBINSTID
AND   t1.JOBINSTID = t3.JOBINST_ID
GROUP BY FIELD1;

PS:为您在SELECT CLAUSE中使用的表提供FIELD1,FIELD2的别名。

答案 2 :(得分:0)

FIELD2来自哪个表格?在这里猜测:大概是,您想要对FIELD2的每个单独实例求和,但由于一对多的关系,查询/数据可能会使您获得每个FIELD2的多个实例在您的数据中。如果是这样,修复方法是修改您的查询,以便将FIELD2重复出现。