2012-03-01 3 views
1

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

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

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 выше. Я знаю, почему это происходит и что-то это понимает, но я не знаю, как это исправить. Как изменить этот запрос, чтобы получить правильную сумму?

EDIT: JOBINSTID является уникальным идентификатором в таблицах 1 и 2, но не в таблице 3.

ответ

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

+0

Извините, я был намеренно старался держать его простым и оставлял некоторые детали. JOBINSTID уникальны в таблицах 1 и 2, но не в таблице 3. Я отредактировал OP, чтобы отразить это. – Kittoes0124

0

Try this.It должен работать.

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, для которых таблицы используется в ЗЕЬЕСТЕ.

+0

Да, те круглые скобки беспокоили меня тоже. Я не думаю, что они имеют какой-то эффект, но тогда я никогда так не кодирую, так кто знает? –

+0

Этот запрос будет работать синтаксически, но Kittoes, возможно, понадобится какой-то другой o/p, я думаю .. – Teja

+0

Я считаю, что круглые скобки являются требованием к доступу, так как код не будет работать без них. – Kittoes0124

0

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

+0

Вы правы. Проблема в том, что я получаю несколько экземпляров, и я не знаю, как пересмотреть запрос, чтобы отсеять их. – Kittoes0124

Смежные вопросы