0

我是这个门户的新手。我有一个非常简单的问题要解决。它与 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关键字,也会将一行复制两次作为下面查询的结果。我知道我的问题相当具体而不是普遍,但有人提出的解决方案可能会帮助其他人解决类似的问题。

4

2 回答 2

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

并建立下一个连接。

于 2011-08-11T11:18:22.310 回答
0

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

于 2011-08-11T10:16:21.603 回答