比较一列不匹配的两个表,并给出备用行-sql

时间:2015-03-20 05:53:28

标签: mysql sql sql-server-2008 asp-classic isqlquery

我的要求如下,

我需要从两个相同的表中比较数据,其中给出版本名称&除[Value]之外的所有其他列匹配。 它需要以“是”“否”显示在备用行中

我的查询:

Select  [Versions],[Profile],Value,[Step1],[Step2],[Step3],[Step4],[Step5],[Step6],[Step7],[UploadedBy] 
from 
(
SELECT a.[Versions],a.[Profile],a.[Value] ,a.[Step1],a.[Step2],a.[Step3],a.[Step4],a.[Step5],
a.[Step6],a.[Step7] ,a.[UploadedBy],a.[UploadedOn] FROM [CREP].[dbo].[T_CRI_RollenProfile_CurrentProfiles] as a 
inner join [CREP].[dbo].[T_CRI_RollenProfile_MasterProfiles] as b 
on  
( a.[Profile]=b.[Profile] and a.[Step1]=b.[Step1] and a.[Step2]=b.[Step2] and a.[Step3]=b.[Step3] and 
a.[Step4]=b.[Step4]and a.[Step5]=b.[Step5] and a.[Step6]=b.[Step6] and a.[Step7]=b.[Step7])  
where  a.Value<>b.Value and  a.[Versions]='Current_20150318_v2'  
union 
SELECT a.[Versions],a.[Profile],a.[Value] ,a.[Step1],a.[Step2],a.[Step3],a.[Step4],
a.[Step5],a.[Step6],a.[Step7] ,a.[UploadedBy],a.[UploadedOn] 
FROM [CREP].[dbo].[T_CRI_RollenProfile_MasterProfiles] as a 
inner join [CREP].[dbo].[T_CRI_RollenProfile_CurrentProfiles] as b  
on ( a.[Profile]=b.[Profile] and a.[Step1]=b.[Step1] and a.[Step2]=b.[Step2] and a.[Step3]=b.[Step3] 
and a.[Step4]=b.[Step4]and a.[Step5]=b.[Step5] and a.[Step6]=b.[Step6] and a.[Step7]=b.[Step7]) 
where a.[Versions]='Master_20150318_v4' and a.Value<>b.Value) as data  
group by [Profile],[Step1],[Step2],[Step3],[Step4],[Step5],[Step6],[Step7],[Versions],Value,[UploadedBy]"

有人可以提供帮助。我没有得到所需的输出。我不知道我错过了什么地方......联合

表格结构&amp;条件

[dbo].[T_CRI_RollenProfile_CurrentProfiles]  a.[Versions]='Current_20150318_v2'
[dbo].[T_CRI_RollenProfile_MasterProfiles] a.[Versions]='Master_20150318_v4'

a.[Profile]=b.[Profile] and a.[Step1]=b.[Step1] and a.[Step2]=b.[Step2] and
a.[Step3]=b.[Step3] and a.[Step4]=b.[Step4]and a.[Step5]=b.[Step5] and 
a.[Step6]=b.[Step6] and a.[Step7]=b.[Step7])where a.[Versions]="[]" and a.Value<>b.Value

1 个答案:

答案 0 :(得分:0)

很难说没有数据要检查,但这看起来可能是同样的事情。只是一个未经验证的查询,繁忙但很简单。

SELECT  a.Versions, a.Profile, a.Value, a.Step1, a.Step2, a.Step3, a.Step4, a.Step5,
        a.Step6, a.Step7, a.UploadedBy
FROM    CREP.dbo.T_CRI_RollenProfile_CurrentProfiles as a 
join    CREP.dbo.T_CRI_RollenProfile_MasterProfiles as b 
    on  a.Profile = b.Profile
    and a.Step1 = b.Step1 
    and a.Step2 = b.Step2 
    and a.Step3 = b.Step3 
    and IsNull( a.Step4, 'null' ) = IsNull( b.Step4, 'null' )
    and IsNull( a.Step5, 'null' ) = IsNull( b.Step5, 'null' )
    and IsNull( a.Step6, 0 ) = IsNull( b.Step6, 0 ) -- if step6 is a numeric field
    and IsNull( a.Step7, 'null' ) = IsNull( b.Step7, 'null' )
where   a.Value<>b.Value 
    and a.Versions in( 'Current_20150318_v2', 'Master_20150318_v4' )
order by Profile, Step1, Step2, Step3, Step4, Step5, Step6, Step7, UploadedBy, Value desc;

在屏幕截图中,Step3显示两次,一次显示数据,一次不显示。从显示的两个整行中,我不得不假设如果字段显示数据,那么它是非NULL。因此,假设您希望两个表中的同一字段中的NULL计为相同值,则必须使用IsNull。对于第二个参数,请使用在字段中无法找到的值作为实际值。它必须与该领域的类型相同。因此,如果如图所示,Step6是数字字段,则第二个参数也必须是数字。我显示零,但如果这是一个可能的实际值,请选择其他内容。

我不明白的是分组。是否可以在表中具有多个行,并且所有字段中的数据都相同,并且您希望将它们合并到一个输出行中?我猜不是,但如果是这样,只需在DISTINCT之后添加SELECT就可以了。

您确实需要order by所有字段除了 VersionsValue字段应该是最后一个和下降 - '否'之前是'否'。