2016-07-18 2 views
0

TABLE_A와 TABLE_B의 두 테이블이 있습니다. 이것은 내가하고 싶은 것입니다 : TABLE_A에서 FIELD_2의 모든 고유 한 발생을 각 발생에 대해 가장 높은 FIELD_1과 함께 취하십시오. 그런 다음 TABLE_B의 해당 FIELD_3이 '확인'되지 않은 곳에있는 FIELD_1의 항목 만 선택하십시오. (FIELD_1은 TABLE_A 및 TABLE_B에 모두 존재합니다.)기준을 취하기 전에 집계 함수 적용

처음에는 앞에서 설명한대로 3 단계로 간단하게 시작했습니다. 나는이 가져 수행 할 작업을 계속 같이, 그러나

/* START Step 3 – Take only those of the highest FIELD_1 from TABLE_A, where the corresponding FIELD_3 in TABLE_B is not ‘OK’ */ 
SELECT DISTINCT 
    FIELD_1 
FROM 
    TABLE_B 
WHERE 
    FIELD_1 IN 
    (
    /* START Step 2 – Take only the highest FIELD_1 from Step 1 */ 
    SELECT 
     MAXFIELD_1 
    FROM 
     (
     /* START Step 1 – Take the highest FIELD_1 for all of the FIELD_2 which are in TABLE_A */ 
     SELECT 
      FIELD_2, 
      MAX(FIELD_1) MAXFIELD_1 
     FROM 
      TABLE_A 
     GROUP BY 
      FIELD_2 
     /* END Step 1 */ 
     ) 
    /* END Step 2 */ 
    ) 
AND 
    FIELD_3 <> 'OK' 
/* END Step 3 */ 

: (즉, 내가 코드를 작성하는 방법이다, 나는 그것이 바깥쪽으로 길을 1 단계로 시작하고, 일을하는 것이 가장 쉬운 방법입니다 무슨 짓을 참조하십시오) 추악하고 못 생기고, 나는 JOIN 문을 사용하여 단축하는 방법을 찾고있다.

SELECT 
    A.FIELD_2, 
    MAX(A.FIELD_1) FIELD_1 
FROM 
    TABLE_A A 
    INNER JOIN TABLE_B B ON A.FIELD_1 = B.FIELD_1 
WHERE 
    B.FIELD_3 <> 'OK' 
GROUP BY 
    A.FIELD_2 

불행하게도, 지금의 일이 보인다 것은> 'OK'FIELD_3 < 해당하는 경우 MAX (A.FIELD_1가) TABLE_A에서 가장 높은 FIELD_1를 반환한다는 것입니다 : 처음에 나는이 시도했다. 즉, where 문이 먼저 적용되고 다음에 FIELD_1이 가장 많이 선택됩니다. 우선 A.FIELD_2 및 MAX (A.FIELD_1)를 선택하고 이후에 을 선택해야하며 B.FIELD_3 <> 'OK'인 경우 만 선택하십시오.

어떻게하면됩니까?

내가 쿼리에 DISTINCT 키워드를보기 위해 기다리고 있었다 TABLE_A

에 FIELD_2의 모든 고유 항목을 가지고 : 당신이 당신의 첫 번째 요구 사항을 적용 곳

답변

0

는 이해가 안 돼요.

A.FIELD_2MAX(A.FIELD_1) 필드를 취한 후에 B.FIELD_3 <> 'OK'을 필터링하려면 HAVING 절을 사용할 수 있습니다.

SELECT 
    A.FIELD_2, 
    MAX(A.FIELD_1) FIELD_1, 
    B.FIELD_3, 
FROM 
    TABLE_A A 
    INNER JOIN TABLE_B B ON A.FIELD_1 = B.FIELD_1 
GROUP BY 
    A.FIELD_2 
HAVING 
    FIELD_3 <> 'OK' 
+0

안녕하세요! 답변 주셔서 감사합니다. 불행히도 그것은 작동하지 않았다. GROUP BY에 B.FIELD_3을 추가 했으므로 실행할 수있게 수정했습니다. 그 결과는 이전의 시도와 똑같은 기록입니다. 문제는 처음에 B : FIELD_3을 포함한다는 사실과 관련이 있다고 생각합니다. 즉, 처음에는 SELECT 용어에서 B.FIELD_3이 발생할 때마다 가장 높은 A.FIELD_1을 얻습니다. 그럼 B.FIELD_3이 'OK'인 가장 높은 A.FIELD_1과 다른 모든 B.FIELD_3의 경우 가장 높은 A.FIELD_1에 대한 레코드를 모두 얻게됩니다. – CupofTea

+0

그런 다음 HAVING 용어를 포함 시키면 가장 높은 B : FIELD_3 만 선택하게됩니다. A.FIELD_1은 '확인'되지 않았으므로 피하려고 했었습니다. 처음에는 SELECT 용어에서 B.FIELD_3없이 실행하려고했지만 여전히 작동하지 않았습니다. – CupofTea

+0

그건 그렇고, 처음에는 쿼리에서 DISTINCT를 예상했다. 나는 GROUP BY를 사용할 때 DISTINCT를 사용할 필요가 없다고 생각했지만 아마 오해했을 것입니다. – CupofTea