0

このポータルは初めてです。解決すべき非常に単純な問題があります。これは ANSI SQL に関連しています。BIRT を使用してレポートを作成しており、複数のテーブルからデータを取得しています。SQL 結合がどのように機能するかは理解していますが、完全ではないかもしれません。私は何時間もグーグルを調査しましたが、関連する答えが見つかりませんでした。

私の問題は、コード内の関係の 1 つが重複した結果を生成することです (同じ行がコピーされます - 重複します)。私はそれを解決しようと決心し、利用可能なすべてのタイプの結合を使用しました。この SQL の一部は既に作成されています。以下にコードを掲載します。私の問題に対する解決策の 1 つは、'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キーワードを使用した場合でも、以下のクエリの結果として1行が2回コピーされることがわかっています。私の問題はかなり具体的で一般的ではないことを知っていますが、誰かが提案する解決策は、同様の問題を抱えている他の人を助けるかもしれません.

4

2 に答える 2

1

テスト データがなければ問題を解決することはできませんが、役立つヒントがいくつかあります。

原則として、DISTINCT には細心の注意を払う必要があります。DISTINCT は、クエリのバグを隠す優れた方法です。基になるデータに正当な重複が含まれていることが確実な場合にのみ、DISTINCT を使用してください。結合が間違っていて、デカルト積を取得している場合は、DISTINCT を使用して結果から重複を削除できますが、デカルト積の生成は停止しません。パフォーマンスが非常に低下し、データが正しくない可能性があります。

第 2 に、DISTINCT が適切に機能していることは確かです。ほぼ確実に重複が発生していませんが、2 つの行の違いを見つけるのは難しいかもしれません。たとえば、テキスト列の先頭または末尾のスペースが原因である可能性があります。

最後に、この問題を解決するには、結合ごとに結合してクエリを作成し、どこで重複が発生するかを確認することをお勧めします。これが結合のせいです。

したがって、次から始めます。

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

そして次の結合まで構築します。

于 2011-08-11T11:18:22.310 に答える
0

結果が完全に重複していると確信していますか? 実際に異なる値を持つ列が 1 つもないようにします。

于 2011-08-11T10:16:21.603 に答える