2016-07-04 13 views
0

Ich verwende MS SQL Server Management Studio. Und ich habe 2 Abfragen, die ich zu einem zusammenführen muss.Erstellen einer komplexen SQL-Abfrage

erste ist (Sie brauchen nicht die Bedeutung davon zu bekommen, gehen Sie einfach zum nächsten Text):

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 BY TestCase_Key Und ich habe diese Abfrage als Ansicht gespeichert MyView und deren Verwendung in der folgenden Abfrage:

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 

Jetzt muß ich diese 2 Abfragen fusionieren, also bin ich nicht erlaubte einen Blick in meinem Anwendungsfall zu verwenden. Könnte jemand helfen oder einen Hinweis geben? Ich habe mit "in" -Klausel experimentiert, aber es ist mir nicht gelungen.

+1

Da Ihre zweite Abfrage nur für 1 Zeile suchen ist einfach, Ihre erste Abfrage ändern oben 1. Und fügen Sie in den zusätzlichen Einschränkungen in der where auswählen , und stellen Sie die Reihenfolge von – Mike

+0

Hi als ks viel für Hinweise. Es ist plausibel und ich habe es versucht, aber es hat nicht funktioniert von mir. Könnten Sie sagen, wo ich diese ** row_number() über (Partition von TestCase_Key Reihenfolge von Execution_Date desc) als rn ** setzen sollte, damit es funktioniert? – ekaterina

+0

Nur um zu überprüfen, ob wir in die gleiche Richtung gehen, können Sie in einfachem Englisch sagen, was Sie mit der zweiten Abfrage zurückgeben wollen? Es sieht aus wie du möchtest rn = 1 also das ist die erste Reihe nur aus der Sicht, aber du hast Sortierung in der Ansicht, die dann durch die Reihenfolge von in der Zeile überschrieben wird Nummer – Mike

Antwort

0

Da Sie das letzte Ausführungsdatum für jeden TestCase_Key haben möchten, habe ich meine ursprüngliche Antwort überarbeitet.

Ich habe Ihre ursprüngliche Ansicht als eine abgeleitete Tabelle verwendet und die Reihenfolge und Top 100% entfernt, die für die unnötige Sortierung erforderlich waren.

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 

Wenn das ist, was Sie brauchen, dann können Sie es flach durch eine der Schichten zu entfernen, und Entfernen von zusätzlichen Spalten und Tabellen, die nicht für das Endergebnis erforderlich sind

Hier abgeflacht ist, hoffentlich Sie werden in der Lage sein, in der inneren Select-Anweisung einige Verknüpfungen zu entfernen:

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

Hallo Mike, nach Ihrem Kommentar erkannte ich, dass ich ein falsche Abfrage in der ersten nun ist es eine richtige da. Ich bekomme kein richtiges Ergebnis, indem ich nur select top (1) verwende, nach welchen Kriterien wählt man den Eintrag aus? In meinem Anwendungsfall habe ich Testfälle, die jeweils einen Testlaufstatus haben, zu diesem Testlaufstatus gehört ein Ausführungstermin. Ich muss nur die Einträge mit dem letzten Ausführungsdatum für jeden Testlauf-Status anzeigen. – ekaterina

+0

Ich sehe jetzt, dass Sie die Zeile 1 für jeden TestCase_Key basierend auf dem letzten Test_Run.executionDate wollen. Ich werde die Abfrage wiederholen. aber im Wesentlichen, wenn Sie die erste Abfrage, strip out die Reihenfolge von und top 100%, wickeln Sie es in Klammern und fügen Sie diesen Code vor MyView in Ihrer aktuellen Abfrage sollte es funktionieren, dann kann es aufräumen – Mike

+0

hmm .. das war eigentlich das erste was ich ausprobiert habe, aber es hat nicht geklappt .. aber ich hatte 100 prozent da und jetzt probierte ich es nochmal ohne es und es funktionierte immer noch nicht .. – ekaterina

Verwandte Themen