在左外连接的情况下无法设置ID列

时间:2011-06-21 10:51:36

标签: sql sql-server sql-server-2005 tsql

我有 tblFiltered

的记录
ID  RowID   Position    Data
1   1        a1          R
1   1        b1          N
1   1        e1          K
1   1        g1          N
1   1        h1          R
1   2        b2          T
1   2        c2          B
1   2        d2          Y
1   2        f2          F

tblComplete 具有以下数据

RowID   Position    Data
1         a1        NULL
1         b1        NULL
1         c1        NULL
1         d1        NULL
1         e1        NULL
1         f1        NULL
1         g1        NULL
1         h1        NULL
2         a2        NULL
2         b2        NULL
2         c2        NULL
2         d2        NULL
2         e2        NULL
2         f2        NULL
2         g2        NULL
2         h2        NULL

所需的输出是

ID  RowID   Position  CompleteData
1   1         a1           R
1   1         b1           N
1   1         c1           NULL
1   1         d1           NULL
1   1         e1           K
1   1         f1           NULL
1   1         g1           N
1   1         h1           R
1   2         a2           NULL
1   2         b2           T
1   2         c2           B
1   2         d2           Y
1   2         e2           NULL
1   2         f2           F
1   2         g2           NULL
1   2         h2           NULL

这意味着不在tblFiltered中的记录将从tblCompelete获取并且将被填充。 例如c1,d1和f1不在tblFiltered中,此后从tblCompelte中获取并添加到结果输出中。

我写了查询

select t.ID,c.RowID,c.Position,
 CompleteData = case when t.Data IS null then null else t.data end
from @CompleteData c
left join @tblFiltered t 
on c.Position = t.Position

,其输出为

ID    RowID Position    CompleteData
1       1       a1               R
1       1       b1               N
NULL    1       c1               NULL
NULL    1       d1               NULL
1       1       e1               K
NULL    1       f1               NULL
1       1       g1               N
1       1       h1               R
NULL    2       a2               NULL
1       2       b2               T
1       2       c2               B
1       2       d2               Y
NULL    2       e2               NULL
1       2       f2               F
NULL    2       g2               NULL
NULL    2       h2               NULL

可以看出,我无法设置ID 。此外,如果ID变为>在tblFiltered中,我将如何跟踪它?

DDL

Declare @tblFiltered table(ID int,RowID int,Position varchar(10),Data varchar(10))     
Insert into @tblFiltered     
Select 1,1,'a1','R' union all     
Select 1,1,'b1','N' union all     
Select 1,1,'e1','K' union all     
Select 1,1,'g1','N' union all     
Select 1,1,'h1','R' union all     
Select 1,2,'b2','T' union all     
Select 1,2,'c2','B' union all     
Select 1,2,'d2','Y'  union all   
Select 1,2,'f2','F'

Declare @CompleteData table (RowID int,Position varchar(10),Data varchar(10))
Insert into @CompleteData
select  1, 'a1', Null Union All
select  1, 'b1', Null Union All
select  1, 'c1', Null Union All
select  1, 'd1', Null Union All
select  1, 'e1', Null Union All
select  1, 'f1', Null Union All
select  1, 'g1', Null Union All
select  1, 'h1', Null Union All
select  2, 'a2', Null Union All
select  2, 'b2', Null Union All
select  2, 'c2', Null Union All
select  2, 'd2', Null Union All
select  2, 'e2', Null Union All
select  2, 'f2', Null Union All
select  2, 'g2', Null Union All
select  2, 'h2', Null 
--Select * from @tblFiltered
--Select * from @CompleteData 

提前致谢

2 个答案:

答案 0 :(得分:0)

让我们以表tblComplete

中的位置为c1为例

您会注意到,在您的示例中, 在tblFiltered中没有对应的行

所以位置为c1的行的tblFiltered.ID实际上是NULL

也许您想对ID做一个案例陈述 或者只包括tblFiltered中匹配的行?

让我们知道哪一个,我们可以帮助您。

答案 1 :(得分:0)

select 1 as ID,
       C.RowID,
       C.Position,
       F.Data
from tblComplete as C
  left outer join tblFiltered as F
    on C.Position = F.Position
order by C.RowID, C.Position