2016-03-20 97 views
1

我正在尝试编写一个表比较查询,当一行中的所有值都不相等时,它将返回通过/失败列。我有基本的语法,但它是传递/失败整个数据集,而不是特定的行。不知道是否需要在某处使用子查询。谢谢!使用CASE T SQL表比较SQL

Actual Output: 
TestID LastName FirstName PrimaryLevel Result 
1   Smith  John   1   Fail 
2   Jones  Adam   2   Fail 
3   Barker  Bob   3   Fail 

Expected Output: 
TestID LastName FirstName PrimaryLevel Result 
1   Smith  John   1   Pass 
2   Jones  Adam   2   Fail 
3   Barker  Bob   3   Fail 

--Code: 
declare @TestID int 

declare @TestIDExpected varchar(max) 
declare @LastNameExpected varchar(max) 
declare @FirstNameExpected varchar(max) 
declare @PrimaryLevelExpected varchar(max) 

declare @TestIDActual varchar(max) 
declare @LastNameActual varchar(max) 
declare @FirstNameActual varchar(max) 
declare @PrimaryLevelActual varchar(max) 

set @TestID = 3 

set @TestIDExpected = (select TestID from ExpectedResults where TestID = @TestID) 
set @LastNameExpected = (select LastName from ExpectedResults where TestID = @TestID) 
set @FirstNameExpected = (select FirstName from ExpectedResults where TestID = @TestID) 
set @PrimaryLevelExpected = (select PrimaryLevel from ExpectedResults where TestID = @TestID) 

set @TestIDActual = (select TestID from ActualResults where TestID = @TestID) 
set @LastNameActual = (select LastName from ActualResults where TestID = @TestID) 
set @FirstNameActual = (select FirstName from ActualResults where TestID = @TestID) 
set @PrimaryLevelActual = (select PrimaryLevel from ActualResults where TestID = @TestID) 

select TestID, LastName, FirstName, PrimaryLevel, 
    case 
    when @TestIDExpected = @TestIDActual and @LastNameExpected = @LastNameActual and @FirstNameExpected = @FirstNameActual and @PrimaryLevelExpected = @PrimaryLevelActual then 'Pass' 
    else 'Fail' 
    END as Result from ActualResults 
+0

请您详细说明一下您的逻辑?为什么约翰史密斯期望通过,其他两个失败? – Mureinik

+0

没问题,谢谢。 John Smith将通过,因为ExpectedResults和Actual Results中的所有返回值均为=。其他两行不是。现在看,它可能是TestID设置为3,当我试图运行所有3个测试。 – AndrewC10

回答

1

我想你可以用普通的SQL来实现你所需要的。使用LEFT JOIN可以始终返回行,并填充TestResult列,并填充相应的值,指示是否找到匹配项。

如果只有两个表中的一行与TestID = 3那么结果将返回一行。您可以修改WHERE子句和您声明的变量值来满足您的需求。

声明变量和值:

DECLARE @TestID INT = 3; 

运行比较查询:

SELECT 
    a.TestID 
    , a.LastName 
    , a.FirstName 
    , a.PrimaryLevel 
    , CASE WHEN b.TestID IS NOT NULL THEN 'Pass' ELSE 'Fail END AS TestResult 
FROM 
    ActualResults a 
    LEFT JOIN ExpectedResults b ON 
    a.TestID = b.TestID 
    AND a.LastName = b.LastName 
    AND a.FirstName = b.FirstName 
    AND a.PrimaryLevel = b.PrimaryLevel 
WHERE 
    a.TestID = @TestID 

如果你想比较整个数据集,那么你就可以用WHERE条款沿降DECLARE声明:

SELECT 
    a.TestID 
    , a.LastName 
    , a.FirstName 
    , a.PrimaryLevel 
    , CASE WHEN b.TestID IS NOT NULL THEN 'Pass' ELSE 'Fail END AS TestResult 
FROM 
    ActualResults a 
    LEFT JOIN ExpectedResults b ON 
    a.TestID = b.TestID 
    AND a.LastName = b.LastName 
    AND a.FirstName = b.FirstName 
    AND a.PrimaryLevel = b.PrimaryLevel 
+0

这有效,但只返回3的TestID。如果我想用TestID 1和2返回3行测试/数据,是否有可能?谢谢 – AndrewC10

+0

正如我在我的回答中所说的,删除WHERE条件。如果你这样做,你也不需要声明的变量。它将扫描整个“ActualResults”表。 –

+0

刚刚看到那部分,非常感谢,完美的作品! – AndrewC10