请问,查询这样重复记录的SQL语句该怎么写?

时间:2022-03-06 06:25:56
有两张表,要查询出两张表中相同图号的记录,而一张表本就存在相同的图号的

记录,若另一张表也有此图号记录,则同图号的都要显示。
例如:  表A                        表B
    产品图号    数量             产品图号     数量
  B150-01-01    100             B150-01-02    20
  B150-01-02     50             B150-01-01    60 
  B150-01-03     30             B150-01-02    30 
  B150-01-01     50             B150-01-01    80            
希望查询的结果为:产品图号_a  数量_a    产品图号_b    数量_b
                  B150-01-01  100       B150-01-01    60
                  b150-01-01   50       B150-01-01    80
                  b150-01-02   50       B150-01-02    20
                  B150-01-02   50       B150-01-02    30
不知该如何做到,盼各位高物赐教!

41 个解决方案

#1


不会这个问题,题外的问题:不知高物赐教什么意思?

#2


笑死我了

#3


這個問題太難了,我最多只能做到像這樣的結果
                  B150-01-01  100       B150-01-01    60
                  b150-01-01  50        B150-01-01    80
                  b150-01-02  50        B150-01-02    20
                  NULL        NULL      B150-01-02    30


還是等高手吧。

#4


先把B表倒到临时表,再用两个嵌套的CURSOR,应该可以做到.

不过引用按钮同志的话:"好象这么做吃力不讨好"!

#5


怪表,写个存储过程,用cursor慢慢转吧

#6


to Rewiah(乘长风) 
各位高手见谅,一不小心打成了“高物”:)

to  N_chow(一劍飄香) 
请问要作到你的这样,该怎么写呢?

#7


你的问题有些古怪,
    我们查询出的内容一般都是有实际应用的,
我想不出
        B150-01-01  100      B150-01-01    60
        B150-01-01  50        B150-01-01    80
代表什么含义
                  

#8


你给的例子对吗?

#9


iuri(璇玑) ,
把兩個table按產品及數數排序灌到兩個temp table中,加上IDENTITY做為關鍵字,并以此關鍵字做為關聯條件就能達到我說的那種效果。

#10



                  B150-01-01  100     B150-01-01    80
                  B150-01-01  50      B150-01-01    60
为什么不显示?

#11


是用户要求这样的,他希望查出任意两个表具有相同图号的记录,而如果这个相同图号在各自的表中本身就存在相同图号的记录,则要把这些相同图号的记录都显示出来,所以就是达到这种结果了,当然象N_chow(一劍飄香)所说的那种结果也可以

#12


insert into temp select * from b where exists ( select * from a where a.=b.) 
update temp set temp.= (select distinct a. from a where temp.=a.)

#13


我觉得你在设计计算方法时存在问题,我在想,你怎么要这么怪的查询结果呢?我觉得进行一项目工作,最重要的是计算方法。

#14


我感觉这么做是否在欺骗我们的用户,那不是就是为了美观么?本来他就有一个记录但你把他显示成两个,这不是虚夸么?

#15


我的疑问与sky_blue(蓝天)一样,为什么
B150-01-01  100    B150-01-01    80
B150-01-01  50     B150-01-01    60
不需要显示出来?

客户的需求并不明确,可能有多个结果集都能满足要求。
这样的需求不是不能做,只是怀疑这样做出来的结果有多少可用价值!!!

#16


to Pipi0714(皮皮0714) 
   只有一条记录我当然是只要求显示一条,只是当A表有一条而B表有两条时就要显示两条,反之相同,怎么会变成虚夸了.

to icevi(按钮工厂) 
   为什么说“
B150-01-01  100    B150-01-01    80
B150-01-01  50    B150-01-01    60
不需要显示出来?”
我就是要它们显示出来呀!

to 大家:
   客户的需求就如我上面所说的,看大家的回答,好象我的方法是有点不大对劲,可就这种需求,不知大伙能否帮我提供一些其他的方法。谢谢!

#17


to liuri(璇玑) :
按道理两个表关联后,结果集中应该有这样几条记录的(只对B150-01-01而言):
B150-01-01  100      B150-01-01    60
b150-01-01  50       B150-01-01    80
B150-01-01  100      B150-01-01    80
B150-01-01  50       B150-01-01    60
奇怪的是你写的例子只需要得到其中两条,什么理由?



                  

#18


to icevi(按钮工厂) 
   本来我作出的东西就是你说的那个结果,其实现在还是保持这个状态,可那天用户使用了之后说这样他就会误认A表中有四条同图号的记录,所以最好只显示两条,可我半天也没搞出来,我是在VFP里用SQL语言,对于SQL才开始接触,我想还是尽量满足用户需求吧,盼多多赐教!

#19


select distinct a.产品图号 as"产品图号_a",a.数量 as"数量_a",
                b.产品图号 as"产品图号_b",b.数量 as"数量_b"
from table1 a join table2 b
on a.产品图号=b.产品图号
(sql server)

#20


我觉得用户的要求不合理. 说服用户他那么表示有些不伦不类

#21


to lllmby() 
   你这种写法不能显示多条相同图号的记录。

to sky_blue(蓝天) 
   我说服不了他:),而且他所需要确实只要两条,这样显示了四条,混淆了分析结果,好象不太好。

   

#22


还有谁能说说吗?

#23


select a.产品图号,a.数量,b.产品图号,b.数量 from a,b
where a.产品图号=b.产品图号 and a.产品图号 in (select 产品图号 from a order by 产品图号) and b.产品图号 in ( select 产品图号 from b order by 产品图号)            

#24


写错了:
select a.产品图号,a.数量,b.产品图号,b.数量 from a,b
where a.产品图号=b.产品图号 and a.产品图号 in (select 产品图号 from b order by 产品图号) and b.产品图号 in ( select 产品图号 from a order by 产品图号)

#25


to wlk(温水):
   在子查询里设置order by 子句,前面要select top n 吧,我把它加上后,运行显示的还是象 icevi(按钮工厂) 她们说的四条记录的那一种.我只要两条的那种。
 
   大家知道的还是帮我写写吧,即使它真的不合理!非常感谢!!!!!!!!!!
   
   今天是新年伊始,祝大家新年幸福!

#26


你总结个规律出来吧, 如果左边5条同图号,右边7条同图号你要几条记录?
怎么搭配?
                  B150-01-01  100      B150-01-01    60
                  b150-01-01  50      B150-01-01    80
                  b150-01-02  50      B150-01-02    20
                  B150-01-02  50      B150-01-02    30

我如果做出的结果是

                  B150-01-01  100      B150-01-01    80
                  b150-01-01  50      B150-01-01    60
                  b150-01-02  50      B150-01-02    20
                  B150-01-02  50      B150-01-02    30


结果是不是合法?

#27


to sky_blue(蓝天) :
左边5条同图号,右边7条同图号就要7条,反正是要多的那一种,你做出的那种结果可以,顺序没有关系,能帮我写写语句吗?感谢!

#28


让我做只能用游标了.

#29


a表
B150-01-01 100 
b150-01-01 50
b150-01-02 50
B150-01-03 50
B150-01-01 90
B150-01-03 60
B150-01-02 70
B 表
B150-01-01 60
B150-01-01 80
B150-01-02 20
B150-01-03 60
B150-01-03 50
B150-01-03 90
結果是什麼樣子?

#30


to sky_blue(蓝天):
   请问怎么用游标做呢?


to yinzhen(yinzhen) :
B150-01-01 100          B150-01-01 60
b150-01-01 50           B150-01-01 80
B150-01-01 90           NULL       NULL
b150-01-02 50           B150-01-02 20
B150-01-02 70           NULL       NULL
B150-01-03 50           B150-01-03 60
B150-01-03 60           B150-01-03 50
NULL       NULL         B150-01-03 90

 顺序没有关系!
 



#31


推一下

#32


create table test_a ( a int, b int)
go
create table test_c ( a int, c int)
go
create table tmp ( a int , b int , a1 int, b1 int)
go
drop proc proc_test_1
go
create proc proc_test_1 ( @a int)
as
begin
  set nocount on
  select identity(int,1,1) as x,a,b into #tmp1 from test_a where a =@a;
  select identity(int,1,1) as x,a,c into #tmp2 from test_c where a =@a;
  insert into tmp select #tmp1.a ,#tmp1.b ,#tmp2.a ,#tmp2.c from #tmp1 full join #tmp2 on #tmp1.x =#tmp2.x;
  set nocount off
end
go
drop proc proc_test_2
go
create proc proc_test_2
as
begin
  set nocount on
  truncate table tmp
  declare @a int
  declare cur_x cursor for select distinct a from test_a
  open cur_x
  fetch cur_x into @a
  while @@FETCH_STATUS = 0 
  begin
    execute proc_test_1 @a
    fetch cur_x into @a
  end
  close cur_x
  deallocate cur_x
  select * from tmp
  set nocount off
end
go

#33


test_a和test_c相当于你的表A和表B
tmp表是存放你需要结果的表
直接运行proc_test_2就可以得到结果.

a字段是你的图号.试试看行不行

#34


还是用vfp的cursor来做吧。
create cursor cursorname…… 然后追加,处理反而简单

#35


谢谢sky_blue(蓝天) ,好长哪!!我才学SQL,看样子得慢慢啃!

#36


能满足要求吗? 别忘了加分哦

#37


to sky_blue(蓝天) :
   你那里面有些我还看不太懂,正在学习,太菜了:),而且我要转成VFP的,慢慢研究,一定给你加分,大家来者有分哪,

#38


create table #Tmptbl(a varchar(10),b int)
declare @AA varchar(10) ,@AB int ,@BA varchar(10),@BB int
delete from #Tmptbl
insert into #Tmptbl (a,b)
Select a,b from tblBookA order by 1,2
DECLARE   cur_Test  CURSOR
for Select a,b from tblbook
open cur_Test
fetch next from  cur_Test into @AA,@AB
while @@fetch_status=0 
Begin
Select @BA=null ,@BB=Null
Select  top  1 @BA=a,@BB=b  from  #Tmptbl where a=@AA 

insert into tblBookc(a,b,c,d) values(@AA,@AB,@BA,@BB)
delete #Tmptbl  from (Select  top  1 a,b  from  #Tmptbl where a=@AA  ) as t1 where t1.a=#tmptbl.a and t1.b=#tmptbl.b


fetch next from  cur_Test into @AA,@AB
End
Select * from #Tmptbl
set  @AA=null
set @AB=Null
insert into tblBookC (a,b,c,d) Select @AA as a,@AB as b,a as c ,b as d from #tmptbl
close cur_Test
deallocate cur_Test
select a,b ,c,d  from tblBookC order by 1,2,3,4
select * from tblbook
Select * from tblBookA
----呵呵,我用的游標,你看行不行?

#39


难到这个问题用SQL需要这么复杂,唉,这样我真是用VFP还方便些了,主要是我不太懂SQL

#40


稍微改了一下,终于做完了,谢谢大家的帮助,结帐啦:)

#41


select a.th,a.num,b.th,b.num
from A a,B b
where a.th[9]=b.th[9] and a.th[10]=b.th[10];

#1


不会这个问题,题外的问题:不知高物赐教什么意思?

#2


笑死我了

#3


這個問題太難了,我最多只能做到像這樣的結果
                  B150-01-01  100       B150-01-01    60
                  b150-01-01  50        B150-01-01    80
                  b150-01-02  50        B150-01-02    20
                  NULL        NULL      B150-01-02    30


還是等高手吧。

#4


先把B表倒到临时表,再用两个嵌套的CURSOR,应该可以做到.

不过引用按钮同志的话:"好象这么做吃力不讨好"!

#5


怪表,写个存储过程,用cursor慢慢转吧

#6


to Rewiah(乘长风) 
各位高手见谅,一不小心打成了“高物”:)

to  N_chow(一劍飄香) 
请问要作到你的这样,该怎么写呢?

#7


你的问题有些古怪,
    我们查询出的内容一般都是有实际应用的,
我想不出
        B150-01-01  100      B150-01-01    60
        B150-01-01  50        B150-01-01    80
代表什么含义
                  

#8


你给的例子对吗?

#9


iuri(璇玑) ,
把兩個table按產品及數數排序灌到兩個temp table中,加上IDENTITY做為關鍵字,并以此關鍵字做為關聯條件就能達到我說的那種效果。

#10



                  B150-01-01  100     B150-01-01    80
                  B150-01-01  50      B150-01-01    60
为什么不显示?

#11


是用户要求这样的,他希望查出任意两个表具有相同图号的记录,而如果这个相同图号在各自的表中本身就存在相同图号的记录,则要把这些相同图号的记录都显示出来,所以就是达到这种结果了,当然象N_chow(一劍飄香)所说的那种结果也可以

#12


insert into temp select * from b where exists ( select * from a where a.=b.) 
update temp set temp.= (select distinct a. from a where temp.=a.)

#13


我觉得你在设计计算方法时存在问题,我在想,你怎么要这么怪的查询结果呢?我觉得进行一项目工作,最重要的是计算方法。

#14


我感觉这么做是否在欺骗我们的用户,那不是就是为了美观么?本来他就有一个记录但你把他显示成两个,这不是虚夸么?

#15


我的疑问与sky_blue(蓝天)一样,为什么
B150-01-01  100    B150-01-01    80
B150-01-01  50     B150-01-01    60
不需要显示出来?

客户的需求并不明确,可能有多个结果集都能满足要求。
这样的需求不是不能做,只是怀疑这样做出来的结果有多少可用价值!!!

#16


to Pipi0714(皮皮0714) 
   只有一条记录我当然是只要求显示一条,只是当A表有一条而B表有两条时就要显示两条,反之相同,怎么会变成虚夸了.

to icevi(按钮工厂) 
   为什么说“
B150-01-01  100    B150-01-01    80
B150-01-01  50    B150-01-01    60
不需要显示出来?”
我就是要它们显示出来呀!

to 大家:
   客户的需求就如我上面所说的,看大家的回答,好象我的方法是有点不大对劲,可就这种需求,不知大伙能否帮我提供一些其他的方法。谢谢!

#17


to liuri(璇玑) :
按道理两个表关联后,结果集中应该有这样几条记录的(只对B150-01-01而言):
B150-01-01  100      B150-01-01    60
b150-01-01  50       B150-01-01    80
B150-01-01  100      B150-01-01    80
B150-01-01  50       B150-01-01    60
奇怪的是你写的例子只需要得到其中两条,什么理由?



                  

#18


to icevi(按钮工厂) 
   本来我作出的东西就是你说的那个结果,其实现在还是保持这个状态,可那天用户使用了之后说这样他就会误认A表中有四条同图号的记录,所以最好只显示两条,可我半天也没搞出来,我是在VFP里用SQL语言,对于SQL才开始接触,我想还是尽量满足用户需求吧,盼多多赐教!

#19


select distinct a.产品图号 as"产品图号_a",a.数量 as"数量_a",
                b.产品图号 as"产品图号_b",b.数量 as"数量_b"
from table1 a join table2 b
on a.产品图号=b.产品图号
(sql server)

#20


我觉得用户的要求不合理. 说服用户他那么表示有些不伦不类

#21


to lllmby() 
   你这种写法不能显示多条相同图号的记录。

to sky_blue(蓝天) 
   我说服不了他:),而且他所需要确实只要两条,这样显示了四条,混淆了分析结果,好象不太好。

   

#22


还有谁能说说吗?

#23


select a.产品图号,a.数量,b.产品图号,b.数量 from a,b
where a.产品图号=b.产品图号 and a.产品图号 in (select 产品图号 from a order by 产品图号) and b.产品图号 in ( select 产品图号 from b order by 产品图号)            

#24


写错了:
select a.产品图号,a.数量,b.产品图号,b.数量 from a,b
where a.产品图号=b.产品图号 and a.产品图号 in (select 产品图号 from b order by 产品图号) and b.产品图号 in ( select 产品图号 from a order by 产品图号)

#25


to wlk(温水):
   在子查询里设置order by 子句,前面要select top n 吧,我把它加上后,运行显示的还是象 icevi(按钮工厂) 她们说的四条记录的那一种.我只要两条的那种。
 
   大家知道的还是帮我写写吧,即使它真的不合理!非常感谢!!!!!!!!!!
   
   今天是新年伊始,祝大家新年幸福!

#26


你总结个规律出来吧, 如果左边5条同图号,右边7条同图号你要几条记录?
怎么搭配?
                  B150-01-01  100      B150-01-01    60
                  b150-01-01  50      B150-01-01    80
                  b150-01-02  50      B150-01-02    20
                  B150-01-02  50      B150-01-02    30

我如果做出的结果是

                  B150-01-01  100      B150-01-01    80
                  b150-01-01  50      B150-01-01    60
                  b150-01-02  50      B150-01-02    20
                  B150-01-02  50      B150-01-02    30


结果是不是合法?

#27


to sky_blue(蓝天) :
左边5条同图号,右边7条同图号就要7条,反正是要多的那一种,你做出的那种结果可以,顺序没有关系,能帮我写写语句吗?感谢!

#28


让我做只能用游标了.

#29


a表
B150-01-01 100 
b150-01-01 50
b150-01-02 50
B150-01-03 50
B150-01-01 90
B150-01-03 60
B150-01-02 70
B 表
B150-01-01 60
B150-01-01 80
B150-01-02 20
B150-01-03 60
B150-01-03 50
B150-01-03 90
結果是什麼樣子?

#30


to sky_blue(蓝天):
   请问怎么用游标做呢?


to yinzhen(yinzhen) :
B150-01-01 100          B150-01-01 60
b150-01-01 50           B150-01-01 80
B150-01-01 90           NULL       NULL
b150-01-02 50           B150-01-02 20
B150-01-02 70           NULL       NULL
B150-01-03 50           B150-01-03 60
B150-01-03 60           B150-01-03 50
NULL       NULL         B150-01-03 90

 顺序没有关系!
 



#31


推一下

#32


create table test_a ( a int, b int)
go
create table test_c ( a int, c int)
go
create table tmp ( a int , b int , a1 int, b1 int)
go
drop proc proc_test_1
go
create proc proc_test_1 ( @a int)
as
begin
  set nocount on
  select identity(int,1,1) as x,a,b into #tmp1 from test_a where a =@a;
  select identity(int,1,1) as x,a,c into #tmp2 from test_c where a =@a;
  insert into tmp select #tmp1.a ,#tmp1.b ,#tmp2.a ,#tmp2.c from #tmp1 full join #tmp2 on #tmp1.x =#tmp2.x;
  set nocount off
end
go
drop proc proc_test_2
go
create proc proc_test_2
as
begin
  set nocount on
  truncate table tmp
  declare @a int
  declare cur_x cursor for select distinct a from test_a
  open cur_x
  fetch cur_x into @a
  while @@FETCH_STATUS = 0 
  begin
    execute proc_test_1 @a
    fetch cur_x into @a
  end
  close cur_x
  deallocate cur_x
  select * from tmp
  set nocount off
end
go

#33


test_a和test_c相当于你的表A和表B
tmp表是存放你需要结果的表
直接运行proc_test_2就可以得到结果.

a字段是你的图号.试试看行不行

#34


还是用vfp的cursor来做吧。
create cursor cursorname…… 然后追加,处理反而简单

#35


谢谢sky_blue(蓝天) ,好长哪!!我才学SQL,看样子得慢慢啃!

#36


能满足要求吗? 别忘了加分哦

#37


to sky_blue(蓝天) :
   你那里面有些我还看不太懂,正在学习,太菜了:),而且我要转成VFP的,慢慢研究,一定给你加分,大家来者有分哪,

#38


create table #Tmptbl(a varchar(10),b int)
declare @AA varchar(10) ,@AB int ,@BA varchar(10),@BB int
delete from #Tmptbl
insert into #Tmptbl (a,b)
Select a,b from tblBookA order by 1,2
DECLARE   cur_Test  CURSOR
for Select a,b from tblbook
open cur_Test
fetch next from  cur_Test into @AA,@AB
while @@fetch_status=0 
Begin
Select @BA=null ,@BB=Null
Select  top  1 @BA=a,@BB=b  from  #Tmptbl where a=@AA 

insert into tblBookc(a,b,c,d) values(@AA,@AB,@BA,@BB)
delete #Tmptbl  from (Select  top  1 a,b  from  #Tmptbl where a=@AA  ) as t1 where t1.a=#tmptbl.a and t1.b=#tmptbl.b


fetch next from  cur_Test into @AA,@AB
End
Select * from #Tmptbl
set  @AA=null
set @AB=Null
insert into tblBookC (a,b,c,d) Select @AA as a,@AB as b,a as c ,b as d from #tmptbl
close cur_Test
deallocate cur_Test
select a,b ,c,d  from tblBookC order by 1,2,3,4
select * from tblbook
Select * from tblBookA
----呵呵,我用的游標,你看行不行?

#39


难到这个问题用SQL需要这么复杂,唉,这样我真是用VFP还方便些了,主要是我不太懂SQL

#40


稍微改了一下,终于做完了,谢谢大家的帮助,结帐啦:)

#41


select a.th,a.num,b.th,b.num
from A a,B b
where a.th[9]=b.th[9] and a.th[10]=b.th[10];