Hardevsinh Mori Ответов: 1

Join возвращает четыре строки вместо двух строк в mysql?


Мне нужно присоединиться к трем столам
1) Таблица:: Партии:
batch_no процесс далее
1 резка 1
1 забиваем 2
2 резка 1
2 долбят 2

2)Таблица:: Резка
Бно резки переделки
170902 1000 20
170902 400 80

3)Таблица:: Забивание Молотком
BNO loadqty молотковая переделка
170902 1000 0 0
170902 500 0 0

Это моя хранимая процедура для повторного выполнения вывода:
CREATE DEFINER=`SKP`@`%` PROCEDURE `Ham`(in batch varchar(100))
BEGIN
declare oseq int;
declare gseq int;
declare proc varchar(30);

set @oseq=(select seq from batches where batch_no=batch and `process`='Hammering');
set @gseq=@oseq-1;
set @proc=(select `process` from batches where batch_no=batch and seq=@gseq);
if(@proc='Cutting') then

select b.esize,b.planned_qty,(ifnull(sum((c.cutting+c.rework)),0)-ifnull(h.loadqty,0)) as `In`,ifnull(sum(h.hammering+h.rework),0) as `Out`
from batches as b
left join cutting as c on c.bno=b.batch_no
left join hammering as h on h.bno=b.batch_no
where 
b.batch_no=batch and b.`process`='Hammering';
end if;
END


Описанная выше процедура возвращает четыре строки вместо двух.

Пример Вывода
позвоните Хэму('1');

Выход:
esize                Planned     In     Out   
'9.000 X 9.000 BPM',  '1500',   '2000', '0'

The above result is calculation of 4 rows

Результат должен быть
esize           Planned     In     Out   
'9.000 X 9.000 BPM',  '1500',    '0', '0'


Что я уже пробовал:

Для объяснения приведенного выше кода:
1) партии не имеет более одного. условие-это процесс (уникальный)
2) резка имеет Бно более одного.
3) долбят не имеет более одного.

Поискал в google и обнаружил, что это проблема дублирования данных, но я не нашел решения.

1 Ответов

Рейтинг:
5

Wendelius

Примеры кодов, которые вы разместили, скорее всего, изменены таким образом, что на самом деле невозможно увидеть реальную проблему. Например:
- Запрос содержит столбцы, не включенные в определения таблиц
- Запрос содержит SUM но нет GROUP BY
- Соединяющие столбцы содержат значения, не совпадающие друг с другом
- и так далее...

Но глядя на код некоторые наблюдения

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

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

Но самое главное, если в вашем вычислении слишком много строк, попробуйте выполнить запрос без суммирования значений. Используйте SELECT * для извлечения всех данных, включенных в расчет. Таким образом, вы должны быть в состоянии видеть, какие строки перечислены несколько раз, и это должно помочь вам точно определить отсутствующее условие/соединение или недопустимые данные.


[no name]

"Используйте SELECT * для извлечения всех данных, включенных в расчет"
я сделал это, но мне нужна сумма для расчета кол-ва акций, я думаю, что у меня есть проблема в моем состоянии и соединении таблиц.Данные извлекаются неправильно с помощью SELECT * FROM, если я использую это, то он также возвращает одну строку два раза.

Wendelius

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

Когда вы извлекаете все строки, вы можете поближе взглянуть на данные и увидеть, какие данные являются недействительными. Это поможет вам найти отсутствующее / недопустимое соединение/условие.

Другими словами, когда вы суммируете строки, вы можете видеть недопустимые выходные данные, но вы не можете видеть отдельные элементы данных, вызывающие эту проблему. Вот почему я предлагаю не использовать SUM при исследовании проблемы.

[no name]

Спасибо, сэр, проблема решена. Проблема была в Join & я не использовал Group By с SUM Select.

[no name]

Вы не должны извлекать различные части данных отдельно, вместо этого попробуйте реализовать логику в одном операторе.
Вы говорите что-то вроде этого:
левое соединение (выберите cutting,rework from Cutting as c) на b. batch_no=c.bno

Wendelius

Не совсем. Я имею в виду, что в начале вы получаете данные в отдельных операторах

set @oseq=(выберите seq из пакетов, где batch_no=batch и 'process`= 'Hammering');
set @gseq=@oseq-1;
set @proc=(выберите " process` из пакетов, где batch_no=batch и seq=@gseq);

Так почему бы не добавить все это в основной оператор SQL или не поместить хотя бы в один оператор, в зависимости от реальной ситуации

[no name]

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

Wendelius

Я не совсем понимаю, что ты имеешь в виду. В любом случае рассмотрим следующее

set @proc=(выберите b1. ' process`
из партий В1,
партии b2
где b1. batch_no=b2.batch_no
и B1.сл = В2.сл - 1
и b2. batch_no=партия
и b2. 'process' ='Hammering');

[no name]

- Спасибо Вам Большое, Сэр. За все(отвечать, объяснять)