2009-07-28 8 views
1

내가 가진 두 개의 열이, 부모에 연결된 자식 항목의 역사를 기록하는 테이블 : 일부 예제 데이터는 다음과 같습니다이 SQL 쿼리는 어떻게 작성합니까?

  • ParentId
  • ChildId

을 :

ParentId - ChildId
001 - 001
001 - 001
001 - 001
001-002
001-002
001-002
001 - 003
001 - 003
001 - 003
001-
001 003 - 004
001-004
001-005
001-005
001-005
001-005

주어진 ParentId에 대해 ChildId 값이 가장 큰 모든 행을 선택해야합니다. - 005
001 - 005
001 - 005

001 : 그래서 위의 예에서 나는 '@parentId = 001'의 입력 매개 변수를 주어, 다음 행을 반환하는 쿼리를 필요 001 - 005

어떤 도움을 주셔서 감사합니다!

+0

지금까지 해보신 것은 무엇입니까? Stack Overflow는 작업을 돕기위한 것이 아니라 작업을 수행하기위한 것이 아닙니다. –

+0

나는 그것을 깨닫는다. 그리고 ive는 대부분의 오후에 노력했다! – MalcomTucker

+0

내 생각 엔 순서가있는 중첩 쿼리가 필요하고 상위 1 개를 선택해야하지만 문법을 올바르게 구할 수없는 것 같습니다. – MalcomTucker

답변

5

이 어떤 일이 그것을 할 :

SELECT * FROM MyTable 
WHERE parentId = '001' 
AND childId = (SELECT MAX(childId) FROM MyTable WHERE parentId = '001') 
+0

유망 해 보입니다. 감사합니다. – MalcomTucker

+0

여러개의 parentId가있는 경우 문제가 있습니다. –

+0

에릭에게 감사드립니다. 모든 정렬 된 – MalcomTucker

1

어때?

SELECT ParentID, MAX(ChildID) AS ChildID 
FROM TableName 
GROUP BY ParentID 

모든 행 반환 놓친 요구 사항을 수정하는 업데이트 :

테스트 데이터

-- Populate Test Data 
CREATE TABLE #table (
    ParentID varchar(3) NOT NULL, 
    ChildID varchar(3) NOT NULL 
) 

INSERT INTO #table VALUES ('001','001') 
INSERT INTO #table VALUES ('001','001') 
INSERT INTO #table VALUES ('001','001') 
INSERT INTO #table VALUES ('001','002') 
INSERT INTO #table VALUES ('001','002') 
INSERT INTO #table VALUES ('001','002') 
INSERT INTO #table VALUES ('001','003') 
INSERT INTO #table VALUES ('001','003') 
INSERT INTO #table VALUES ('001','003') 
INSERT INTO #table VALUES ('001','003') 
INSERT INTO #table VALUES ('001','004') 
INSERT INTO #table VALUES ('001','004') 
INSERT INTO #table VALUES ('001','005') 
INSERT INTO #table VALUES ('001','005') 
INSERT INTO #table VALUES ('001','005') 
INSERT INTO #table VALUES ('001','005') 

결과

-- Return Results 
DECLARE @ParentID varchar(8) 
SET @ParentID = '001' 

SELECT T1.ParentID, T1.ChildID 
FROM #table T1 
JOIN (
    SELECT Q1.ParentID, MAX(Q1.ChildID) AS ChildID 
    FROM #table Q1 
    GROUP BY ParentID 
) ParentChildMax ON ParentChildMax.ParentID = T1.ParentID AND ParentChildMax.ChildID = T1.ChildID 
WHERE T1.ParentID = @ParentID 

참고 :이 솔루션의 성능은 WHERE 절에 다음 문을 사용하여 허용 된 솔루션 (SQL Server 프로파일 러에 따라)과 동일합니다. 하지만 내 솔루션이 더 깨끗해 보이고 다른 ParentID가 포함되도록 쉽게 확장 할 수 있으므로 필자의 솔루션이 더 마음에 든다. (예 :보고 목적.)

(SELECT MAX(childId) FROM #table WHERE parentId = @ParentID) 
+0

이것이 올바른 대답입니다. 오, 알겠습니다 ... dup 대답 – dar7yl

+0

@ daryl : 그것은 옳은 대답이 아닙니다. 이 대답은 한 행만 반환합니다. OP는이 기준을 충족하는 모든 행을 반환하려고했습니다. – Eric

+0

@eric - 아, 맞습니다. 그러나 원래 테이블에 대한 간단한 조인은 ParentID 및 ChildID를 키로 사용하여 올바른 데이터를 반환합니다. 이 방법을 사용하면 '001'만 보는 것에 국한되지 않고 모든 ParentID에 대해 최대 값을 얻을 수 있습니다. SELECT MAX() 하위 쿼리가 주 테이블과 상호 연관되어 있으면 솔루션의 유용성이 확장되어 선택한 대답이 더 향상됩니다. – beach

-1

테이블에서 여러 부모를 수용하기 위해, TABLE_NAME FROM

select parentId, max(childid) as ChildId 
from <table_name> 
group by parentId 
+0

이것 (그리고 바닷가의 대답)이 더 나은 해결책입니다. – dar7yl

+0

간단한 "GROUP BY"문보다 테이블 조인을 사용하면 어떤 해결책을 제시 할 수 있습니까? –

1
SELECT * 
FROM TABLENAME 
WHERE parentId = '001' 
AND childid = (select MAX (ChildId) 
       from TABLENAME 
       where parentId = '001') 
0

SELECT *
을 도움이 될 것입니다 다음
WHERE ParentId = @parentId
GROUP BY ParentId
HAVING ChildId = MAX (ChildId)

관련 문제