问题描述
- 查询两个表的数据,然后第一个表的数据存在相同时,则只显示一行,其他的显示为空
-
如上图,第一个表的字段包含 内码、编号、客户、日期,第二个表包含出库单等字段,现在查询出来的数据,只要内码相同,则对应的内码、编号、客户、日期都显示为空,该如何写SQL语句,原SQL语句如下select t1.内码,t1.编号,t1.客户,t1.日期,t2.出库单
from SEOrder t1 join icstockbill t2 on t1.FInterID=t2.FInterID
解决方案
danielinbiti 思路是可以的,但是结果不对把
既然人家内联可以出所有结果, 表icstockbill和SEOrder都会有重复的内码啊,稍微改下
select t2.出库单,
case when t2.RN = 1 then t1.内码 else '' end as 内码,
case when t2.RN = 1 then t1.编号 else '' end as 编号,
case when t2.RN = 1 then t1.客户 else '' end as 客户,
case when t2.RN = 1 then t1.日期 else '' end as 日期
from
(select 出库单, 内码, ROW_NUMBER()OVER(PARTITION BY 内码 ORDER BY 内码) AS RN FROM icstockbill) t2
join
(select 内码,编号,客户,日期 FROM SEOrder) t1
on t2.FInterID=t1.FInterID
解决方案二:
select t1.内码,t1.编号,t1.客户,t1.日期,t2.出库单
from SEOrder t1 join icstockbill t2 on t1.FInterID=t2.FInterID
建议你把数据处理出来后,在前台处理起来比较方便,或者在后台用存储过程,定义一个游标,判断一下如果等于上一行的值就设置编号等为空
解决方案三:
换个思路,你这相当于就是出库单是左表,然后与第一张表左连接。因为相同的内容要是空行,那再加一个行号。如果内码相同,内码内的行号一样,则有记录
SQLServer和Oracle的如下,MySQL的参见我微薄原来写的怎么实现ROW_NUMBER
select t1.内码,t1.编号,t1.客户,t1.日期,t2.出库单
from
(select 出库单,ROW_NUMBER()OVER(PARTITION BY 内码 ORDER BY 内码) AS RN FROM icstockbill) t2
left join
(select 内码,编号,客户,日期,ROW_NUMBER()OVER(PARTITION BY 内码 ORDER BY 内码) AS RN FROM SEOrder) t1
on t2.FInterID=t1.FInterID and t2.rn=t1.rn
时间: 2024-09-17 04:31:21