이 포털을 처음 사용합니다. 나는 해결해야 할 아주 간단한 문제가있다. 이것은 ANSI SQL과 관련이 있습니다. BIRT를 사용하여 보고서를 작성 중이며 여러 테이블에서 데이터를 가져옵니다. 나는 SQL이 어떻게 작동하는지 이해하지만 어쩌면 완전하지는 않을 것이다. 나는 몇 시간 동안 Google을 연구했고 관련 답변을 찾을 수 없었습니다.관계가 쿼리에서 중복 레코드를 생성합니다. DISTINCT가 작동하지 않으며 다른 솔루션을 사용할 수 있습니까?
내 문제는 코드의 관계 중 하나가 동일한 결과를 생성한다는 것입니다 (동일한 행이 복사 됨 - 복제 됨). 나는 그것을 해결할 결심 이었기 때문에 모든 유형의 조인을 사용할 수있었습니다. 이 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'
나는 테스트 데이터의 너무 많이 없지만 나는 1 개 개의 행이 나는 DISTINCT
키워드를 사용하더라도 그래도 아래 쿼리의 결과로 두 번 복사됩니다 것을 알고있다. 나는 내 문제가 다소 구체적이고 일반적인 것이 아니라는 것을 알고있다. 누군가가 제안 할 해결책은 비슷한 문제를 가진 다른 사람들을 도울 수있다.
대단히. 데이터베이스의 경우 간단한 보고서 나 복잡한 쿼리를 디자인 할 때마다 항상 테이블의 구조를 연구하고 명확한 참조가 필요한 ERD를 작성하는 경향이 있습니다. 나는 'distinct by'대신에 duplicates를 건너 뛰기 위해 'group by'명령을 사용하는 누군가를 보았다. – techspeque
Johann Strydom에 대한 귀하의 답변을 보았습니다. emediadetails.data에 추가 콘텐츠가있는 경우 테이블에 조인 기준과 일치하는 두 개의 행이 있음을 알 수 있습니다. 조인을 정제하여 검색 할 행을 지정하는 방법이 있습니까? 가장 중요한 방법은 "%
'이 아닌"Cplandata "를 추가하는 것이지만 더 좋은 방법이 있습니다."그룹화 기준 "을 사용하여이 작업을 수행하는 방법은 max (keyvalue1)를 선택한 다음 모든 그룹별로 그룹화하는 것입니다. 해당 열의 데이터가 합법적으로 복제되고 첫 번째 레코드가 원하는 경우에만 수행하십시오. –