在一个表上选择查询并在同一个表上加入

时间:2013-07-01 10:10:36

标签: sql sql-server join

我对一个表上的选择查询感到困惑,但将两个相同的列连接在一起。为了简化我的问题,我对情况进行了重建。 我有一张看起来像这样的桌子:

declare @DummyTable Table 
(
    Id int, 
    MainName varchar(20), 
    SubName varchar(20), 
    sequenceNumber int
)

此表包含下一个数据:

insert into @DummyTable 
values ( 0, 'MainName1', 'SubName1', 1),
       ( 1, 'MainName1', 'SubName2', 2),
       ( 2, 'MainName1', 'SubName3', 3),
       ( 3, 'MainName1', 'SubName6', 4),
       ( 4, 'MainName1', 'SubName7', 5),
       ( 5, 'MainName2', 'SubName1', 1),
       ( 6, 'MainName2', 'SubName2', 2),
       ( 7, 'MainName2', 'SubName3', 3),
       ( 8, 'MainName2', 'SubName4', 4),
       ( 9, 'MainName2', 'SubName5', 5),
       (10, 'MainName2', 'SubName6', 6),
       (11, 'MainName2', 'SubName7', 7),
       (12, 'MainName3', 'SubName1', 1),
       (13, 'MainName3', 'SubName2', 2),
       (14, 'MainName3', 'SubName3', 3)

现在我尝试获取包含文本MainName1的所有记录,并且在同一行上我还想要记录MainName2,由SubName列匹配,如下所示:

Id | MainName  | SubName  | s | Id | MainName  | SubName  | s -- s = SequenceNumber
--------------------------------------------------------------
 5 | MainName2 | SubName1 | 1 |  0 | MainName1 | SubName1 | 1
 6 | MainName2 | SubName2 | 2 |  1 | MainName1 | SubName2 | 2
 7 | MainName2 | SubName3 | 3 |  2 | MainName1 | SubName3 | 3
 8 | MainName2 | SubName4 | 4 | NULL | NULL    | NULL     | NULL
 9 | MainName2 | SubName5 | 5 | NULL | NULL    | NULL     | NULL
10 | MainName2 | SubName6 | 6 |  3 | MainName1 | SubName6 | 4
11 | MainName2 | SubName7 | 7 |  4 | MainName1 | SubName7 | 5

我尝试使用下一个查询来管理它:

 select *
 from @DummyTable dt1
 left join @DummyTable dt2 on dt1.SubName = dt2.SubName
 where dt1.MainName like '%Name2%'
 and dt2.MainName like '%Name1%'
 order by dt1.MainName, dt1.sequenceNumber

但是当我执行这个查询时,我得到了我想要的结果,但是缺少了ID 8和9的记录。我试图加入,或者只加入(没有左或右)但是所有都给出了相同的结果,没有显示带有8和9的记录。我无法弄清楚我在这里做错了什么而且我也想知道为什么我是没有看到丢失的记录。谁能帮助我理解我的问题以及如何解决它?

1 个答案:

答案 0 :(得分:2)

尝试此查询:

select *
from @DummyTable dt1
left join @DummyTable dt2 on dt2.SubName = dt1.SubName and dt2.MainName like '%Name1%'
where dt1.MainName like '%Name2%' --and (dt2.MainName like '%Name1%')
order by dt1.MainName, dt1.sequenceNumber   

由于您的null条款已从结果中过滤掉与where不匹配的记录,因此您丢失了dt2.MainName like '%Name1%'个值。

编辑:我的查询工作不正常,因为dt2并不总是返回null,因为缺少值,所以我将参数移到了join子句中,现在它按预期工作了。