Sql 从3个不同的表中查询数据-检查表是否有匹配的记录,如果没有,则显示它们
我有3张桌子,我需要加入。我一直在考虑在MS Access中创建查询,但我不想这样做,我希望通过SQL SERVER只需一个查询就可以做到这一点 这是我的桌子和我想要完成的Sql 从3个不同的表中查询数据-检查表是否有匹配的记录,如果没有,则显示它们,sql,sql-server,join,Sql,Sql Server,Join,我有3张桌子,我需要加入。我一直在考虑在MS Access中创建查询,但我不想这样做,我希望通过SQL SERVER只需一个查询就可以做到这一点 这是我的桌子和我想要完成的 Tbl1 - Main table NoClient LocID 123 23 133 45 880 25 123 55 tbl2 NoClient
Tbl1 - Main table
NoClient LocID
123 23
133 45
880 25
123 55
tbl2
NoClient ClinNo
123 112233
123 223344
133 334455
tbl3
ClinNo NoClient IssueNo
112233 123 7788979
223344 123 4564133
这里没有显示更多的列
我的目标:
Tbl1是插入数据的主表。我需要能够显示所有记录,其中:
- tbl1有一个
-的值,但tbl2中没有相应的值。这是一个棘手的问题,因为tbl1可能有同一客户机的多个实例(NoClient
)。在这种情况下,tbl2中有2条记录,因此所有记录都很好,但是…如果tbl1有两条记录,但tbl2只有1条记录,则显示tbl1中没有相应记录的记录NoClient 123
- 如果tbl2具有与给定客户端相同数量的记录,则tbl1需要检查tbl3中是否存在该
和NoClient
的相应值(因为现在我们有两个字段可供参考)。如果存在-只需检查tbl3中的ClinNo
是否为空。如果为空-则显示该记录IssueNo
NoClient LocID
133 45
880 25
将显示133,因为此记录在tbl2中有相应的值,而在tbl3中没有值。880将被显示,因为它在tbl2或tbl3中没有记录
通过一个查询就可以做这样的事情吗?还是我有点不知所措?我想你把事情搞得太复杂了。从我收集的信息来看,您只需要表1中的所有记录,这些记录在表3中没有对应的(或空)记录,或者在表2中没有对应的记录。如果是这种情况,那么这个相对简单的查询应该可以:
select * from tbl1 where NoClient not in (select tbl2.NoClient from tbl2)
union all
select * from tbl1 where NoClient not in (select tbl2.NoClient from tbl2
inner join tbl3 on tbl2.NoClient=tbl3.NoClient and tbl2.ClinNo=tbl3.ClinNo
where tbl3.IssueNo is not null)
我觉得你把事情搞得太复杂了。从我收集的信息来看,您只需要表1中的所有记录,这些记录在表3中没有对应的(或空)记录,或者在表2中没有对应的记录。如果是这种情况,那么这个相对简单的查询应该可以:
select * from tbl1 where NoClient not in (select tbl2.NoClient from tbl2)
union all
select * from tbl1 where NoClient not in (select tbl2.NoClient from tbl2
inner join tbl3 on tbl2.NoClient=tbl3.NoClient and tbl2.ClinNo=tbl3.ClinNo
where tbl3.IssueNo is not null)
试试这个:
declare @t table (
NoClient int not null,
LocId int not null
)
declare @t1 table (
NoCLient int not null,
ClinNo int not null
)
declare @t2 table (
ClinNo int not null,
NoClient int not null,
IssueNo int not null
)
insert into @t (NoClient, LocId) values (123,23),(133,45),(880,25),(123,55)
insert into @t1 (NoCLient, ClinNo) values (123,112233),(123,223344),(133,334455)
insert into @t2 (ClinNo, NoClient, IssueNo) values (112233,123,7788979),(223344,123,4564133)
-----
select *
from
(select NoClient, LocId, RANK() over (partition by NoClient order by NoClient, LocId) as LocNr from @t) as tr1
left outer join (select NoClient, ClinNo, RANK() over (partition by NoClient order by NoClient, ClinNo) as CliNr from @t1) as tr2
on tr1.NoClient = tr2.NoCLient and tr1.LocNr = tr2.CliNr
left outer join @t2 as tr3 on tr2.NoCLient = tr3.NoClient and tr2.ClinNo = tr3.ClinNo
where tr2.NoCLient is null or tr3.IssueNo is null
这使用Rank()
和over
子句为@t(对应于表tbl1)和@t1(tbl2)中相同的NoClient
的每一行分配一个数字。然后它将这些元素左键连接在一起,然后进一步左键连接@t2(tbl3),并过滤掉所有元素都链接到@t2的行。尝试以下方法:
declare @t table (
NoClient int not null,
LocId int not null
)
declare @t1 table (
NoCLient int not null,
ClinNo int not null
)
declare @t2 table (
ClinNo int not null,
NoClient int not null,
IssueNo int not null
)
insert into @t (NoClient, LocId) values (123,23),(133,45),(880,25),(123,55)
insert into @t1 (NoCLient, ClinNo) values (123,112233),(123,223344),(133,334455)
insert into @t2 (ClinNo, NoClient, IssueNo) values (112233,123,7788979),(223344,123,4564133)
-----
select *
from
(select NoClient, LocId, RANK() over (partition by NoClient order by NoClient, LocId) as LocNr from @t) as tr1
left outer join (select NoClient, ClinNo, RANK() over (partition by NoClient order by NoClient, ClinNo) as CliNr from @t1) as tr2
on tr1.NoClient = tr2.NoCLient and tr1.LocNr = tr2.CliNr
left outer join @t2 as tr3 on tr2.NoCLient = tr3.NoClient and tr2.ClinNo = tr3.ClinNo
where tr2.NoCLient is null or tr3.IssueNo is null
这使用
Rank()
和over
子句为@t(对应于表tbl1)和@t1(tbl2)中相同的NoClient
的每一行分配一个数字。然后左键将这些记录连接在一起,然后进一步左键将@t2(tbl3)连接起来,并过滤掉所有内容都链接到@t2的行。如果tbl1有两条记录,而tbl2只有一条,您如何知道从tbl1返回哪个记录?如果表1有多行,您如何将表2中的行与表1中相应的行进行匹配?例如:您的示例中有两行客户机编号为123。如果表2中只有一行,您如何知道该行与表1中的哪一行“匹配”?您如何确定如何“显示tbl1中没有对应tbl2记录的记录”?是否有一列用于匹配此处未显示的内容?@Jerrad-在本例中,我希望显示tbl3中没有相应值的记录。问题是,如果tbl2有一个值,那么tbl3中有一个值的可能性为99%。如果tbl1有两条记录,但tbl2只有一条记录,您如何知道从tbl1返回哪个记录?如果表1有多行,您如何将表2中的行与表1中相应的行进行匹配?例如:您的示例中有两行客户机编号为123。如果表2中只有一行,您如何知道该行与表1中的哪一行“匹配”?您如何确定如何“显示tbl1中没有对应tbl2记录的记录”?是否有一列用于匹配此处未显示的内容?@Jerrad-在本例中,我希望显示tbl3中没有相应值的记录。问题是,如果tbl2有一个值,那么tbl3中有一个值的可能性为99%。谢谢。但正如其中一条评论所指出的,我无法确定tbl1中的哪个记录在tbl2中没有对应的记录。但这会起作用,因为这样我至少可以缩小范围。谢谢。但正如其中一条评论所指出的,我无法确定tbl1中的哪个记录在tbl2中没有对应的记录。但这会起作用,因为这样我至少可以缩小范围。