2016-07-04 5 views
0

MS SQL Server Management Studio를 사용하고 있습니다. 그리고 나는 2 개의 쿼리를 가지고 있는데, 하나의 쿼리로 병합해야합니다.복잡한 SQL 쿼리 작성

먼저 하나 (그냥 다음 텍스트로 건너, 그것의 의미를 얻을 필요가 없습니다)입니다 :

SELECT  TOP (100) PERCENT dbo.project.name AS Project_name, Test_Run.documentKey AS TestRun_Key, Test_Run.entitytype, Test_Run.documentKey, 
        Test_Case.documentKey AS TestCase_Key, document_1.name AS TestPlan_Name, dbo.lookup.name AS TestCase_Release_Status, 
        Test_Run.testRunStatus AS TestRun_Status, Test_Run.active, dbo.project.id AS Project_ID, dbo.version.versionNumber, Test_Run.executionDate AS Execution_Date, 
        Test_Run.globalId AS TR_glID, Test_Case.globalId AS TC_glID, Test_Run.createdDate AS TR_Created_Date, Test_Case.id AS TestCase_ID, 
        Test_Run.id AS TestRun_ID 
FROM   dbo.[document] AS Test_Run INNER JOIN 
        dbo.project ON Test_Run.projectId = dbo.project.id INNER JOIN 
        dbo.[document] AS Test_Case ON Test_Run.testCaseId = Test_Case.id INNER JOIN 
        dbo.testrunset ON Test_Run.testRunSetId = dbo.testrunset.id INNER JOIN 
        dbo.[document] ON dbo.testrunset.testCycleId = dbo.[document].id INNER JOIN 
        dbo.[document] AS document_1 ON dbo.[document].testPlanId = document_1.id INNER JOIN 
        dbo.version ON Test_Run.testCaseVersionNumber = dbo.version.versionNumber AND Test_Run.testCaseId = dbo.version.originDocumentId INNER JOIN 
        dbo.documentcustomfieldvalue ON dbo.version.documentId = dbo.documentcustomfieldvalue.documentId INNER JOIN 
        dbo.lookup ON dbo.documentcustomfieldvalue.textValue = dbo.lookup.id 
WHERE  (Test_Run.documentTypeId = 55) AND (dbo.documentcustomfieldvalue.fieldId = 216) AND (Test_Run.active = N'T') AND (Test_Case.testCaseStatusId <> 2) 

ORDER를 TestCase_Key 에 의해 그리고 내가보기로이 쿼리를 저장 한 MYVIEW 다음과 같은 쿼리를 사용 :

select TestCase_Key, TestRun_Status, Project_Name 

from (select TestCase_Key, TestRun_Status, Project_Name, 
     row_number() over(partition by TestCase_Key order by Execution_Date desc) as rn 
    from MyView) as T 

where rn = 1 and (Project_Name = 'TestProject') 
    ORDER BY TestRun_Status, TestCase_Key 

가 지금은 즉 내 사용 사례에보기를 사용할 수 없습니다하고,이 2 개 개의 쿼리를 병합 할 필요가있다. 누군가 도움을 주거나 힌트를 줄 수 있습니까? 나는 whith "in"절을 실험했지만 성공하지 못했습니다.

+1

두 번째 쿼리는 단지 1 행만 찾고 있으므로 첫 번째 쿼리를 변경하여 최상위 1을 선택하십시오. , 주문을 조정하여 – Mike

+0

안녕하세요 힌트를 위해 많이 ks. 그럴듯한 그것과 Ive는 그것을 시험해 보았다. 그러나 그것은 나로 움직이지 않았다. 이 ** row_number()를 (Execution_Date desc에 의해 TestCase_Key 순서에 의해) rn **으로 붙여 넣기해야 어디에서 작동하는지 알 수 있습니까? – ekaterina

+0

우리가 같은 방향으로 가고 있는지 확인하기 위해 두 번째 쿼리에서 반환하려는 것을 평범한 영어로 말할 수 있습니까? 그것은 rn = 1을 원하는 것처럼 보이기 때문에 뷰의 첫 번째 행이됩니다. 그러나 row_number의 순서에 의해 오버라이드 된 뷰에서 정렬됩니다. – Mike

답변

0

각 TestCase_Key의 최신 실행 날짜를 원하기 때문에 원래 응답을 수정했습니다.

원본보기를 파생 테이블로 사용하여 불필요한 정렬에 필요한 상위 100 % 순으로 제거했습니다.

select TestCase_Key, TestRun_Status, Project_Name 

from (select TestCase_Key, TestRun_Status, Project_Name, 
     row_number() over(partition by TestCase_Key order by Execution_Date desc) as rn 
    from 
    (SELECT dbo.project.name AS Project_name, Test_Run.documentKey AS TestRun_Key, Test_Run.entitytype, Test_Run.documentKey, 
        Test_Case.documentKey AS TestCase_Key, document_1.name AS TestPlan_Name, dbo.lookup.name AS TestCase_Release_Status, 
        Test_Run.testRunStatus AS TestRun_Status, Test_Run.active, dbo.project.id AS Project_ID, dbo.version.versionNumber, Test_Run.executionDate AS Execution_Date, 
        Test_Run.globalId AS TR_glID, Test_Case.globalId AS TC_glID, Test_Run.createdDate AS TR_Created_Date, Test_Case.id AS TestCase_ID, 
        Test_Run.id AS TestRun_ID 
FROM   dbo.[document] AS Test_Run INNER JOIN 
        dbo.project ON Test_Run.projectId = dbo.project.id INNER JOIN 
        dbo.[document] AS Test_Case ON Test_Run.testCaseId = Test_Case.id INNER JOIN 
        dbo.testrunset ON Test_Run.testRunSetId = dbo.testrunset.id INNER JOIN 
        dbo.[document] ON dbo.testrunset.testCycleId = dbo.[document].id INNER JOIN 
        dbo.[document] AS document_1 ON dbo.[document].testPlanId = document_1.id INNER JOIN 
        dbo.version ON Test_Run.testCaseVersionNumber = dbo.version.versionNumber AND Test_Run.testCaseId = dbo.version.originDocumentId INNER JOIN 
        dbo.documentcustomfieldvalue ON dbo.version.documentId = dbo.documentcustomfieldvalue.documentId INNER JOIN 
        dbo.lookup ON dbo.documentcustomfieldvalue.textValue = dbo.lookup.id 
WHERE  (Test_Run.documentTypeId = 55) AND (dbo.documentcustomfieldvalue.fieldId = 216) AND (Test_Run.active = N'T') AND (Test_Case.testCaseStatusId <> 2)) 
as DerivedTable) as T 

where rn = 1 and (Project_Name = 'TestProject') 
    ORDER BY TestRun_Status, TestCase_Key 

그것은 당신이 필요, 당신은 희망, 그것은 평평 최종 결과 여기

에 필요하지 않은 여분의 열 및 테이블을 레이어 중 하나를 제거하고, 제거하여 평평하게 할 수있는 경우 내부 선택 문에서 일부 조인을 제거 할 수 있습니다.

SELECT TestCase_Key 
    , TestRun_Status 
    , Project_Name 
FROM 
    (
    SELECT dbo.project.name AS Project_name 
     , Test_Case.documentKey AS TestCase_Key 
     , Test_Run.testRunStatus AS TestRun_Status 
     , Test_Run.executionDate AS Execution_Date 
    FROM dbo.[document] AS Test_Run 
     INNER JOIN dbo.project ON Test_Run.projectId = dbo.project.id 
    INNER JOIN dbo.[document] AS Test_Case ON Test_Run.testCaseId = Test_Case.id 
    INNER JOIN dbo.testrunset ON Test_Run.testRunSetId = dbo.testrunset.id 
    INNER JOIN dbo.[document] ON dbo.testrunset.testCycleId = dbo.[document].id 
    INNER JOIN dbo.[document] AS document_1 ON dbo.[document].testPlanId = document_1.id 
    INNER JOIN dbo.version ON Test_Run.testCaseVersionNumber = dbo.version.versionNumber 
         AND Test_Run.testCaseId = dbo.version.originDocumentId 
    INNER JOIN dbo.documentcustomfieldvalue ON dbo.version.documentId = dbo.documentcustomfieldvalue.documentId 
    INNER JOIN dbo.lookup ON dbo.documentcustomfieldvalue.textValue = dbo.lookup.id 
    WHERE(Test_Run.documentTypeId = 55) 
     AND (dbo.documentcustomfieldvalue.fieldId = 216) 
     AND (Test_Run.active = N'T') 
     AND (Test_Case.testCaseStatusId <> 2) 
    ) AS DerivedTable 
WHERE ROW_NUMBER() OVER(PARTITION BY TestCase_Key ORDER BY Execution_Date DESC) = 1 
    AND (Project_Name = 'TestProject') 
ORDER BY TestRun_Status 
     , TestCase_Key; 
+0

안녕하세요, Mike, 귀하의 의견을 듣고 나는 첫 번째 쿼리가 잘못된 쿼리로 바뀌 었습니다. 내가 선택한 상위 (1)를 사용하여 적절한 결과를 얻지 못하고있다. 어떤 기준을 사용하여 항목을 선택 하는가? 나의 유스 케이스에서는 테스트 케이스가 있고, 각각 테스트 실행 상태가 있으며,이 테스트 실행 상태는 실행 날짜에 속한다. 각 테스트 실행 상태에 대한 최신 실행 날짜가있는 항목 만 표시하면됩니다. – ekaterina

+0

이제 Test_Run.executionDate를 기반으로 각 TestCase_Key에 대한 행 1을 원한다는 것을 알았습니다. 나는 질의를 다시 할 것이다. 하지만 기본적으로 첫 번째 쿼리를 가져 와서 상위 100 % 순서대로 제거하고 대괄호로 묶은 다음 현재 쿼리에서 MyView 앞에 코드를 삽입 한 다음 정리할 수 있습니다 – Mike

+0

음 ... 실제로 시도한 첫 번째,하지만 작동하지 않았다 .. 그러나 나는 거기에 100 % 있었는데 지금은 그것없이 다시 시도하고 여전히 작동하지 않았다 .. – ekaterina