отношения производят дубликаты записей по запросу, DISTINCT не работает, какие-либо другие решения доступны? - PullRequest
0 голосов
/ 11 августа 2011

Я новичок в этом портале.У меня очень простая проблема, которую нужно решить.Это связано с ANSI SQL.Я пишу отчеты, используя BIRT, и извлекаю данные из нескольких таблиц.Я понимаю, как работают объединения SQL, но, возможно, не полностью.Я исследовал Google в течение нескольких часов, и я не мог найти соответствующий ответ.

Моя проблема в том, что одно из отношений в коде приводит к дублированию результата (одна и та же строка копируется - дублируется).Я был так полон решимости решить эту проблему, что использовал все доступные типы соединений.Часть этого SQL уже была произведена.Я опубликую свой код ниже.Я знаю, что одним из решений моей проблемы является использование ключевого слова DISTINCT.Я использовал это, и это не решает мою проблему.

Может кто-нибудь предложить какое-либо решение для этого?

Пример кода:

SELECT DISTINCT
   partmaster.partdesc,
   partmaster.uom,
   traders.name AS tradername,
   worksorders.id AS worksorderno,
   worksorders.partid,
   worksorders.quantity,
   worksorders.duedate,
   worksorders.traderid,
   worksorders.orderid,
   routingoperations.partid,
   routingoperations.methodid,
   routingoperations.operationnumber,
   routingoperations.workcentreid,
   routingoperations.settime,
   routingoperations.runtime,
   routingoperations.perquantity,
   routingoperations.description,
   routingoperations.alternativeoperation,
   routingoperations.alternativeoperationpreference,
   machines.macdesc,
   machines.msection,
   allpartmaster.partnum,
   allpartmaster.nbq,
   allpartmaster.partdesc,
   routingoperationtools.toolid,
   tools.tooldesc,
   CAST (emediadetails.data as VARCHAR(MAX)) AS cplandata
FROM worksorders
INNER JOIN partmaster ON worksorders.partid = partmaster.partnum
INNER JOIN traders traders ON worksorders.traderid = traders.id
INNER JOIN routingoperations routingoperations ON worksorders.partid = routingoperations.partid  
       AND worksorders.routingmethod = routingoperations.methodid
INNER JOIN allpartmaster allpartmaster ON routingoperations.partid = allpartmaster.partnum 
LEFT OUTER JOIN machines machines ON routingoperations.workcentreid = machines.macid
LEFT OUTER JOIN routingoperationtools routingoperationtools ON routingoperationtools.partid = routingoperations.partid 
           AND routingoperationtools.routingmethod = routingoperations.methodid 
           AND routingoperationtools.operationnumber = routingoperations.operationnumber     
LEFT OUTER JOIN tools tools ON tools.toolid = routingoperationtools.toolid 
LEFT OUTER JOIN emediadetails ON emediadetails.keyvalue1 = worksorders.id 
            AND emediadetails.keyvalue2 = routingoperations.operationnumber 
            AND emediadetails.emediaid = 'worksorderoperation' 

У меня не слишком много тестовых данных, но яЗнайте, что в результате запроса ниже одна строка копируется дважды, даже если я использовал ключевое слово DISTINCT.Я знаю, что моя проблема довольно специфична и не носит общего характера, но решение, которое кто-то предложит, может помочь другим с подобной проблемой.

Ответы [ 2 ]

1 голос
/ 11 августа 2011

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

В принципе, вы должны быть очень осторожны с DISTINCT - это отличный способ скрыть ошибки в вашем запросе.Используйте DISTINCT только в том случае, если вы уверены, что базовые данные содержат допустимые дубликаты.Если ваши объединения неверны, и вы получаете декартово произведение, вы можете удалить дубликаты из результатов с помощью DISTINCT, но это не остановит создание декартово произведения.Вы получите очень низкую производительность и, возможно, неверные данные.

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

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

Итак, начните с:

SELECT 

                    traders.name AS tradername,
                    worksorders.id AS worksorderno,
                    worksorders.partid,
                    worksorders.quantity,
                    worksorders.duedate,
                    worksorders.traderid,
                    worksorders.orderid
                FROM worksorders
                    INNER JOIN traders traders ON
                        worksorders.traderid = traders.id

и перейдите к следующему соединению.

0 голосов
/ 11 августа 2011

Вы уверены, что результаты являются точными дубликатами? Убедиться, что нет ни одного столбца, который на самом деле имеет другое значение.

...