SQL Inner Join дает неверные результаты - PullRequest
1 голос
/ 02 марта 2012

Я знаю, что ответ на этот вопрос будет чрезвычайно простым, и я решил эту проблему раньше, но по какой-то причине я застрял на этом на час.

У меня следующий запрос:

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, но не в таблице 3.

Ответы [ 3 ]

1 голос
/ 02 марта 2012

Если это проблема «многие-к-одному», связанная с таблицей1, вы можете захотеть:

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;

Если проблема (также) между таблицей 2 и таблицей 3, вам может потребоваться переосмыслить, как нормализуется ваша база данных, но вы можете попробовать это, что, я думаю, будет работать в любом случае:

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, или не указали, какие столбцы являются уникальными в каких таблицах.

0 голосов
/ 02 марта 2012

Из какой таблицы FIELD2? Угадайте здесь: предположительно, вы хотите суммировать каждый отдельный экземпляр FIELD2, но запрос / данные могут быть такими, что вы получаете несколько экземпляров каждого FIELD2 из-за отношения один-ко-многим в ваших данных. Если это так, исправление будет состоять в том, чтобы пересмотреть ваш запрос, исключив дубликаты FIELD2.

0 голосов
/ 02 марта 2012

Попробуйте это. Должно работать.

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: укажите псевдоним для FIELD1, FIELD2, для которого вы используете таблицу в SELECT CLAUSE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...