Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从3个不同的表中查询数据-检查表是否有匹配的记录,如果没有,则显示它们_Sql_Sql Server_Join - Fatal编程技术网

Sql 从3个不同的表中查询数据-检查表是否有匹配的记录,如果没有,则显示它们

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

我有3张桌子,我需要加入。我一直在考虑在MS Access中创建查询,但我不想这样做,我希望通过SQL SERVER只需一个查询就可以做到这一点

这是我的桌子和我想要完成的

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有一个
    NoClient
    -的值,但tbl2中没有相应的值。这是一个棘手的问题,因为tbl1可能有同一客户机的多个实例(
    NoClient 123
    )。在这种情况下,tbl2中有2条记录,因此所有记录都很好,但是…如果tbl1有两条记录,但tbl2只有1条记录,则显示tbl1中没有相应记录的记录
  • 如果tbl2具有与给定客户端相同数量的记录,则tbl1需要检查tbl3中是否存在该
    NoClient
    ClinNo
    的相应值(因为现在我们有两个字段可供参考)。如果存在-只需检查tbl3中的
    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中没有对应的记录。但这会起作用,因为这样我至少可以缩小范围。