2017-03-14 12 views
1

두 테이블 XY와 Tops가 있습니다. MS Access와 SQL을 사용하여 위 테이블에 합류하려고 시도하지만 각 XY.wid에 대해 XY.VD보다 작은 Tops.Depth_Top 만 유지합니다. 저는 SQL을 처음 접했지만 다음과 같은 두 가지 쿼리를 작성했습니다. 첫 번째 임계 값 (Depth_Tops < = TVD) 위에있는 모든 데이터를 식별합니다.SQL Join Table 및 Find Max

SELECT DISTINCT XY.wid, Tops.Name, Tops.Depth_Top, XY.TVD 
    INTO Result_SQ 
    FROM Tops 
    INNER JOIN XY 
    ON Tops.wid = XY.wid 
    WHERE (((Tops.Depth_Top)<=[XY].[TVD])) 
    ORDER BY XY.wid, Tops.Depth_Top 

번째 질의는 처음부터 결과를 얻어 만 최대 Depth_Top 유지.

SELECT * INTO Unique_Result_SQ 
    FROM Result_SQ AS t1 
    WHERE (((t1.Depth_Top)=(Select MAX(Depth_Top) 
    From Result_SQ t2 
    Where t2.XY_wid = t1.XY_wid 
    Group BY t2.XY_wid))); 

이 쿼리는 두 쿼리를 모두 독립적으로 실행하면 원하는 결과를 얻을 수 있지만 두 쿼리를 하나로 결합하는 데 문제가 있습니다.

답변

0

나는 당신이 필요로하는 이유를 잘 모르겠어요 모든 SELECT INTO의 (당신이 정말로 필요한 경우 추가 할 수 있습니다)하지만 난 그냥 대신 선택 목록에 최대를 추가 할 WHERE :

SELECT 
    XY.wid, Tops.Name, XY.TVD , 
    Max(Tops.Depth_Top) 
FROM Tops JOIN XY 
    ON Tops.wid = XY.wid 
WHERE Tops.Depth_Top =< XY.TVD 
Group BY XY.wid, Tops.Name, XY.TVD 

귀하의 의견에 따라, 나는 당신이 당신의 결과 집합에 각 그룹의 최대 싶습니다. 이를 수행하려면 먼저 각 그룹의 각 행에 ROW_NUMBER를 할당 한 다음 최종 SELECT에서 RN = 1 (맨 위 결과) 만 선택하면 코드는 다음과 같이 표시됩니다.

WITH CTE_RN AS 
(
SELECT 
    XY.wid, Tops.Name, XY.TVD , 
    Max(Tops.Depth_Top), 
    ROW_NUMBER () 
     OVER (PARTITION BY XY.wid 
     ORDER BY Tops.Depth_Top DESC) AS RN 
FROM Tops JOIN XY 
    ON Tops.wid = XY.wid 
WHERE Tops.Depth_Top =< XY.TVD 
Group BY XY.wid, Tops.Name, XY.TVD 
) 
SELECT * FROM CTE_RN WHERE RN=1 

테스트하지는 않았지만 아이디어를 제공해야합니다.

+0

답을 고맙습니다. 이 코드는 첫 번째 쿼리와 동일한 결과를 반환합니다. 이것이 이유인지는 모르지만 wid와 Name은 서로 독립적입니다. http://imgur.com/a/EFlvN 아래쪽 두 줄과 함께 강조 표시된 행을 제거하고 싶습니다. –

+0

그래서 한 행만 반환할까요? – morinx

+0

이 예제에서는 두 행 (wid 0 및 1)이됩니다. 원본 테이블의 깊이는 TVD보다 작거나 같습니다. 나는 각 넓이를위한 TVD보다 더 깊은 깊이와 관련된 정보만을 유지하고 싶다. –