2012-10-31 2 views
2

SQL 쿼리를 작성하는 데 익숙하지 않으며 3 개의 다른 테이블에서 정보를 가져 와서 함께 연결하려고했습니다.문제가 3 개 테이블에 합류했습니다.

데이터는 Microsoft SQL Server에 있습니다.

이 (I가 그것을 의도대로 작동하지 않음) 내 현재 쿼리입니다 :

SELECT h.jhhold, h.jhjob, h.jhpart, h.jhrev, h.jhcust, h.jhextd, o.jadesc, h.jhpqty, o.jaoqty, o.jacqty, o.japo, o.javend 
FROM Jhead AS h 
LEFT JOIN jjops AS o ON h.jhjob = o.jajob 
LEFT JOIN hpodt AS p ON h.jhjob = p.hdjob 
WHERE h.jhpcmp = 0 AND o.jatype = 2 AND o.jacqty < o.jaoqty AND japcmp = 0 
ORDER BY h.jhjob 

내가 할 노력하고 있어요 무엇인지 설명합니다. 내가 작업 헤더 테이블 Jhead, 작업 세부 테이블 jjops 및 구매 주문 세부 테이블 hpodt이 있습니다. 작업 번호가 jhead 테이블의 기본 키라고 생각합니다.

내 문제는 다음과 같습니다. 두 번째 왼쪽 가입을 추가하자마자 중복 정보가 추가로 많이 생깁니다.

나는 jhead.jhjob는 GROUP BY를 사용하여 시도했지만 다음과 같은 오류가 발생합니다 :

"이 집계 함수 나 GROUP 중 하나에 포함되지 않기 때문에 열 'jhead.jhhold'는 선택 목록에서 유효하지 않습니다 . jhead.jhjob, jhead.jhhold, jhead.jhpart, jhead.jhrev, jhead.jhcust BY GROUP : BY 절 "

은 그래서 솔루션 중 하나는 다음과 같이 의해 내 그룹을 만들 것을 함께 오류를 연구 , jhead.jhextd

그런 다음 jhead.jhextd를 입력하면이 오류가 발생합니다. "IS NULL 또는 LIKE 연산자를 사용하는 경우를 제외하고는 text, ntext 및 image 데이터 유형을 비교하거나 정렬 할 수 없습니다."

이제 벽돌 벽에 부딪혔습니다. 형식을 NVARCHAR로 변경할 수 있음을 알았습니다. 고유하고 서버에 과중하기 때문에 설명 필드를 기준으로 정렬하고 싶지 않습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

예제 데이터로 편집 : 쿼리를 단순화하기 위해 추가 필드를 제거하고 1 개의 작업 번호에 대한 결과를 필터링했습니다. 당신이 볼 수있는 Second

ERP 소프트웨어는 1 PO 번호에서 여러 작업을 가지고 내가 가진 선을 표시에만 관심 : 모두 왼쪽으로 With only 1 Left Join

조인 : 단지 1로

가입 왼쪽 일치하는 작업 번호. Third

QUERY 이것은 내가 원하는 가까이지고

SELECT h.jhhold, h.jhjob, h.jhrev, o.jadesc, h.jhpqty, o.jaoqty, o.jacqty, o.japo, o.javend, p.hdprcd, p.hdrecd 
FROM Jhead AS h 
LEFT JOIN jjops AS o ON h.jhjob = o.jajob 
LEFT JOIN hpodt AS p ON h.jhjob = p.hdjob 
WHERE h.jhpcmp = 0 AND o.jatype = 2 AND o.jacqty < o.jaoqty AND japcmp = 0 AND p.hdjob = h.jhjob AND p.hdpo = o.japo 
ORDER BY h.jhjob 

업데이트되었습니다. 이제 문제는 jadesc 필드가 각 행마다 실제로 달라야 할 때 첫 번째 결과를 복제한다는 것입니다.

4

난 그냥 하나 개의 작업을 표시하는 필터링. 그 (것)들은 단지 1 개의 란이어야한다.

추가 라인을 얻기하지만 난 당신이 jheadjjops 테이블에 대한 자세한 정보를 표시 할 추측 내가

SELECT h.jhhold, h.jhjob, h.jhrev, o.jadesc, h.jhpqty, o.jaoqty, o.jacqty, o.japo, o.javend, p.hdprcd, p.hdrecd, p.hdseq 
FROM Jhead AS h 
LEFT JOIN jjops AS o ON h.jhjob = o.jajob 
LEFT JOIN hpodt AS p ON h.jhjob = p.hdjob 
WHERE (h.jhpcmp = 0 AND o.jatype = 2 AND o.jacqty < o.jaoqty AND japcmp = 0 AND p.hdjob = h.jhjob AND p.hdpo = o.japo AND p.hdseq = o.jaseq AND o.jaopr != 'PT') 
    OR (h.jhpcmp = 0 AND o.jatype = 2 AND o.jacqty < o.jaoqty AND japcmp = 0 AND o.japo = 0 AND o.jaopr != 'PT') 
ORDER BY h.jhjob, o.jaseq 
+4

일부 샘플 데이터를 게시 한 다음 예상되는 결과를 게시 할 수 있습니까? 각각의'jhjob'과 관련된 레코드가 여러 개 있고 오직 하나만 원한다면 어떤 것을 반환할까요? – Taryn

+0

아, 지금 당장 최선을 다하십시오. – MAK

+0

별칭 사용에 대한이 기사를 읽고 따르십시오. http://msdn.microsoft.com/en-us/library/ms187455(v=sql.90).aspx –

답변

0

을 필요로하는 모든 데이터를 가지고 있지만 단지에서 발견 된 일부 집계 정보를 표시 할 hpodt 테이블

그런 경우에는 다음과 같이해야합니다 :

당신이 hpodt 테이블에서 원하는,하지만 난 서브를 사용하는이 전략을 추측 특정 정보 그것은 내게 분명하지 않다
SELECT 
    h.jhhold, h.jhjob, h.jhpart, h.jhrev, h.jhcust, h.jhextd, 
    o.jadesc, h.jhpqty, o.jaoqty, o.jacqty, o.japo, o.javend, 
    (SELECT COUNT(*) FROM hpodt p WHERE p.jhjob = h.hdjob) AS po_line_count, 
    CASE WHEN EXISTS (SELECT * FROM hpodt p WHERE p.jhjob = h.hdjob) 
     THEN 'found it' 
     ELSE 'not found' 
    END AS info_on_hpodt 
FROM 
    Jhead AS h 
    LEFT JOIN jjops AS o ON h.jhjob = o.jajob 
WHERE 
    h.jhpcmp = 0 AND o.jatype = 2 AND o.jacqty < o.jaoqty AND japcmp = 0 
ORDER BY 
    h.jhjob 

쿼리는 WHERE 절에 다른 기준을 추가하기 만하면 작동합니다.

다른 옵션은 window functions이지만 하위 쿼리 방식은 더 간단합니다.

+0

흠, 그게 내가 필요한 것일 수도 있습니다. 당신이 한 일과 그것을 적용하는 방법을 알아 내야 만합니다. 실제로 모든 세 테이블의 데이터가 있지만, 내 PO # 'o.japo = 0'의 경우, 필자의 열에서 내 'hpodt'테이블에 값이 표시되고 이것이 중복 행의 원인이됩니다. . 'o.japo = 0'일 때 'hpodt'에 적용되는 열에 대한 데이터가 나타나지 않아야합니다. – MAK