关系产生查询重复记录,DISTINCT不起作用,任何其他解决方案可用吗?

时间:2011-08-11 10:10:48

标签: sql join duplicates records ansi-sql

我是这个门户的新手。我有一个非常简单的问题需要解决。它与ANSI SQL有关。我正在使用BIRT编写报告,我从几个表中获取数据。我理解SQL如何工作但可能不完全。我研究谷歌几个小时,我找不到相关的答案。

我的问题是代码中的一个关系产生了重复的结果(同一行被复制 - 重复)。我决心解决它,我使用了各种类型的连接。一些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 个答案:

答案 0 :(得分:1)

如果没有一些测试数据,我无法解决您的问题,但我有一些有用的提示。

原则上,您应该对DISTINCT非常小心 - 这是隐藏查询中错误的好方法。如果您确信基础数据包含合法的重复项,则仅使用DISTINCT。如果您的连接错误,并且您正在获得笛卡尔积,则可以使用DISTINCT从结果中删除重复项 - 但这并不会阻止生成笛卡尔积。你的表现会很糟糕,而且数据可能不正确。

其次,我很确定DISTINCT正常工作 - 你几乎肯定没有得到重复,但可能很难发现两行之间的差异。例如,文本列中的前导或尾随空格可能是罪魁祸首。

最后,为了解决这个问题,我建议通过join建立查询联接,并查看你获得重复的位置 - 这是应该归咎于的联接。

所以,从:

开始
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

并构建到下一个联接。

答案 1 :(得分:0)

您确定结果是完全重复的吗?确保没有一列实际具有不同的值。