2017-05-19 6 views
0

T-SQL을 사용하여 데이터베이스에서 레코드를 반환합니다 (여러 기준이 있지만 고유 ID 목록은 고유해야 함). "파생 열을 유지하는 동안, 나는 ID 필드에-속는을 해제하기 위해 조합을 사용할 수 있도록하고 싶습니다 T-SQL, Union을 사용하여 중복 제거했지만 추가 열 유지

SELECT 
t1.ID, 
[query1mark] = 1 
WHERE criteria1 = 1 

UNION 

SELECT 
t1.ID, 
[query2mark] = 1 
WHERE criteria2 = 1 

가 (데이터가 ID 필드에 고유해야합니다) : T-SQL은 다음과 같다 query1mark "또는"query2mark "를 사용하여 추가 쿼리를 강조 표시합니다. 내 현실 세계에서는 5 개의 쿼리가 서로에 대해 중복 제거되어야하므로 효율적인 솔루션이 필요합니다.

EDIT : 또한 첫 번째 쿼리의 결과는 두 번째 쿼리의 결과보다 우선 순위를 지정해야하며 두 번째 쿼리의 결과는 세 번째 쿼리의 결과보다 우선 순위가 높아야합니다. Union을 사용할 때 고유 한 것으로, 연합 선언문 아래에서 레코드를 추가하기 때문입니다.

유니언이 최선의 해결책인가요? 그렇지 않다면 무엇을 사용할 수 있습니까?

감사합니다 이것에 대해

답변

0

당신이 관계

SELECT top 1 with ties * FROM yourtable 
    ORDER BY ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [criteria]) 
1

무엇 :

DECLARE @DataSource TABLE 
(
    [ID] INT 
    ,[criteria] INT 
); 

INSERT INTO @DataSource ([ID], [criteria]) 
VALUES (1, 1) 
     ,(1, 2) 
     ,(2, 1) 
     ,(3, 1) 
     ,(3, 2) 
     ,(4, 2); 

WITH DataSource ([ID], [query_mark], [RowID]) AS 
(
    SELECT * 
      ,ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [criteria] ASC) 
    FROM @DataSource 
) 
SELECT [id], [query_mark] 
FROM DataSource 
WHERE [RowID] = 1; 

아이디어는 특정 그룹에 대한 모든 중복 요소의 순서를 만드는 것입니다. 복제본은 criteria 필드에 의해 정렬되지만 필요하면 로직을 변경할 수 있습니다. 예를 들어 가장 큰 숫자는 criteria입니다. 그룹은 PARTITION BY [ID] 문을 사용하여 정의됩니다. 즉, 각 [ID] 그룹에 대한 항목을 주문하십시오. 그런 다음 선택에, 우리는 단지이 다소 올바른 생각이 될 것으로 보인다 동안 [RowID] = 1

+0

으로 상위 1을 사용하여 각 그룹마다 하나 개의 기록을 보여줄 필요가 당신이 할 수있는 경우, 궁금 해서요 그것의 논리를 조금 더 자세히 설명해 주시겠습니까? – AspireMonkey

+0

@AspireMonkey 뭔가 명확하지 않은 경우 알려주십시오. – gotqn

+0

나는 논리를 지금 이해하고 있지만 분명히하지 않았으므로 약간의 변경을 가했다. – AspireMonkey