请问这个SQL怎么写?

TGZ 2009-03-18 10:51:45
tb1
--------------------------------------------
ITEMNO ITEMCODE EX ITEMNAME MEMO
1 D DX DDDD DDDD
2 C CX CCCC CCCC
3 B BX BBBB BBBB
4 E EX EEEE EEEE
.......


tb2
--------------------------------------------
ITEMCODE EX EX_Name EX_MEMO
E E1 E11111 e111111
D D1 D11111 D11111
C C1 C11111 C11111
C C2 C22222 C22222
E E1 E11111 E11111


要求结果:
--------------------------
ITEMNO ITEMCODE EX ITEMNAME MEMO
1 D DX DDDD DDDD
D1 D111 D111
2 C CX CCCC CCCC
C1 C111 C111
C2 C222 C222
3 B BX BBBB BBBB
4 E EX EEEE EEEE
E1 E111 E111
.......


要求:ITEMNO为序号,要求按以前的排序,不得改变,请问这个SQL应该如何写呢?
...全文
123 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
TGZ 2009-03-18
  • 打赏
  • 举报
回复
感谢各位,问题描述不清楚,给各位添麻烦了。问题解决了,马上结贴去了!
zzxap 2009-03-18
  • 打赏
  • 举报
回复
select ITEMNO,ITEMCODE,EX,ITEMNAME,MEMO
from(
select
itemno as px,
case when ex like '%X' then ltrim(itemno) else '' end as ITEMNO,
case when ex like '%X' then ITEMCODE else '' end as ITEMCODE,
EX,
ITEMNAME,
MEMO
from
(
select * from tb1 union all
select tb1.itemno,tb2.* from tb2 left join tb1 on tb1.itemcode=tb2.itemcode
) t
) tt
order by px,case when ex like '%X' then 1 else 2 end

LIHY70 2009-03-18
  • 打赏
  • 举报
回复
select ITEMNO, ITEMCODE, EX, ITEMNAME, MEMO  from 
(select ITEMNO, ITEMCODE, EX, ITEMNAME, MEMO, ItemId =ITEMNO, Item_order=1 from tb1
union all
select ITEMNO='', ITEMCODE='', b.EX, left(b.EX_Name,4) as ITEMNAME, left(b.EX_MEMO,4) as MEMO, ItemId=a.ITEMNO, Item_order=2 from tb1 a left join tb2 b on a.ITEMCODE=b.ITEMCODE
) a order by ItemId, Item_order

LIHY70 2009-03-18
  • 打赏
  • 举报
回复

select ITEMNO, ITEMCODE, EX, ITEMNAME, MEMO from
(select ITEMNO, ITEMCODE, EX, ITEMNAME, MEMO, ItemId =ITEMNO, Item_order=1 from tb1 union (select ITEMNO='', ITEMCODE='', b.EX, b.EX_Name as ITEMNAME, b.EX_MEMO as MEMO, ItemId=a.ITEMNO, Item_order=2 from tb1 a left join tb2 on a.ITEMCODE=b.ITEMCODE)) a order by ItemId, Item_order
肥龙上天 2009-03-18
  • 打赏
  • 举报
回复
有点怪!
anwsp 2009-03-18
  • 打赏
  • 举报
回复
mark
中国风 2009-03-18
  • 打赏
  • 举报
回复
use tempdb
go
use Tempdb
go
--> -->

if not object_id('tb1') is null
drop table tb1
Go
Create table tb1([ITEMNO] int,[ITEMCODE] nvarchar(1),[EX] nvarchar(2),[ITEMNAME] nvarchar(4),[MEMO] nvarchar(4))
Insert tb1
select 1,N'D',N'DX',N'DDDD',N'DDDD' union all
select 2,N'C',N'CX',N'CCCC',N'CCCC' union all
select 3,N'B',N'BX',N'BBBB',N'BBBB' union all
select 4,N'E',N'EX',N'EEEE',N'EEEE'
Go

--> -->

if not object_id('tb2') is null
drop table tb2
Go
Create table tb2([ITEMCODE] nvarchar(1),[EX] nvarchar(2),[EX_Name] nvarchar(6),[EX_MEMO] nvarchar(7))
Insert tb2
select N'E',N'E1',N'E11111',N'e111111' union all
select N'D',N'D1',N'D11111',N'D11111' union all
select N'C',N'C1',N'C11111',N'C11111' union all
select N'C',N'C2',N'C22222',N'C22222' union all
select N'E',N'E1',N'E11111',N'E11111'
go


;with c
as
(
select ITEMNO=rtrim(ITEMNO),ITEMCODE,[EX],[ITEMNAME],[MEMO],Flag=1 from tb1
union all
select distinct ITEMNO=tb1.ITEMNO,tb1.ITEMCODE,tb2.[EX],tb1.[ITEMNAME],tb1.[MEMO],Flag=2 from tb1 inner join tb2 on tb1.ITEMCODE=tb2.ITEMCODE)
select
ITEMNO=case when Flag=1 then rtrim(ITEMNO) else '' end,
ITEMCODE=case when Flag=1 then ITEMCODE else '' end,
EX,
ITEMNAME,
MEMO
from
c
order by c.ITEMNO,c.Flag

/*
ITEMNO ITEMCODE EX ITEMNAME MEMO
------------ -------- ---- -------- ----
1 D DX DDDD DDDD
D1 DDDD DDDD
2 C CX CCCC CCCC
C1 CCCC CCCC
C2 CCCC CCCC
3 B BX BBBB BBBB
4 E EX EEEE EEEE
E1 EEEE EEEE

(8 個資料列受到影響)
*/
ws_hgo 2009-03-18
  • 打赏
  • 举报
回复
很奇怪的需求
dawugui 2009-03-18
  • 打赏
  • 举报
回复
--你的E1有两个,如果要去重.

create table [tb1]([ITEMNO] varchar(10) , [ITEMCODE] varchar(1),[EX] varchar(2),[ITEMNAME] varchar(4),[MEMO] varchar(4))
insert [tb1]
select 1,'D','DX','DDDD','DDDD' union all
select 2,'C','CX','CCCC','CCCC' union all
select 3,'B','BX','BBBB','BBBB' union all
select 4,'E','EX','EEEE','EEEE'
create table [tb2]([ITEMCODE] varchar(1),[EX] varchar(2),[EX_Name] varchar(6),[EX_MEMO] varchar(7))
insert [tb2]
select 'E','E1','E11111','e111111' union all
select 'D','D1','D11111','D11111' union all
select 'C','C1','C11111','C11111' union all
select 'C','C2','C22222','C22222' union all
select 'E','E1','E11111','E11111'

select itemno,itemcode,ex,itemname,memo from
(
select * , px1=ITEMNO,px2 = ITEMCODE from tb1
union all
select distinct itemno = '' , itemcode = '',tb2.ex , EX_Name = left(EX_Name,1) + REPLICATE(right(EX_Name,1),3) , EX_MEMO = left(EX_Name,1) + REPLICATE(right(EX_Name,1),3) , px1 = tb1.ITEMNO , px2 = tb2.ITEMCODE from tb2 , tb1 where tb2.ITEMCODE = tb1.ITEMCODE
) t
order by px1 , itemcode desc

drop table tb1 , tb2

/*
itemno itemcode ex itemname memo
---------- -------- ---- -------- --------
1 D DX DDDD DDDD
D1 D111 D111
2 C CX CCCC CCCC
C1 C111 C111
C2 C222 C222
3 B BX BBBB BBBB
4 E EX EEEE EEEE
E1 E111 E111

(所影响的行数为 8 行)


*/
dawugui 2009-03-18
  • 打赏
  • 举报
回复
create table [tb1]([ITEMNO] varchar(10) , [ITEMCODE] varchar(1),[EX] varchar(2),[ITEMNAME] varchar(4),[MEMO] varchar(4))
insert [tb1]
select 1,'D','DX','DDDD','DDDD' union all
select 2,'C','CX','CCCC','CCCC' union all
select 3,'B','BX','BBBB','BBBB' union all
select 4,'E','EX','EEEE','EEEE'
create table [tb2]([ITEMCODE] varchar(1),[EX] varchar(2),[EX_Name] varchar(6),[EX_MEMO] varchar(7))
insert [tb2]
select 'E','E1','E11111','e111111' union all
select 'D','D1','D11111','D11111' union all
select 'C','C1','C11111','C11111' union all
select 'C','C2','C22222','C22222' union all
select 'E','E1','E11111','E11111'

select itemno,itemcode,ex,itemname,memo from
(
select * , px1=ITEMNO,px2 = ITEMCODE from tb1
union all
select itemno = '' , itemcode = '',tb2.ex , EX_Name = left(EX_Name,1) + REPLICATE(right(EX_Name,1),3) , EX_MEMO = left(EX_Name,1) + REPLICATE(right(EX_Name,1),3) , px1 = tb1.ITEMNO , px2 = tb2.ITEMCODE from tb2 , tb1 where tb2.ITEMCODE = tb1.ITEMCODE
) t
order by px1 , itemcode desc

drop table tb1 , tb2

/*
itemno itemcode ex itemname memo
---------- -------- ---- -------- --------
1 D DX DDDD DDDD
D1 D111 D111
2 C CX CCCC CCCC
C1 C111 C111
C2 C222 C222
3 B BX BBBB BBBB
4 E EX EEEE EEEE
E1 E111 E111
E1 E111 E111

(所影响的行数为 9 行)

*/
中国风 2009-03-18
  • 打赏
  • 举报
回复
use Tempdb
go
--> -->

if not object_id('tb1') is null
drop table tb1
Go
Create table tb1([ITEMNO] int,[ITEMCODE] nvarchar(1),[EX] nvarchar(2),[ITEMNAME] nvarchar(4),[MEMO] nvarchar(4))
Insert tb1
select 1,N'D',N'DX',N'DDDD',N'DDDD' union all
select 2,N'C',N'CX',N'CCCC',N'CCCC' union all
select 3,N'B',N'BX',N'BBBB',N'BBBB' union all
select 4,N'E',N'EX',N'EEEE',N'EEEE'
Go

--> -->

if not object_id('tb2') is null
drop table tb2
Go
Create table tb2([ITEMCODE] nvarchar(1),[EX] nvarchar(2),[EX_Name] nvarchar(6),[EX_MEMO] nvarchar(7))
Insert tb2
select N'E',N'E1',N'E11111',N'e111111' union all
select N'D',N'D1',N'D11111',N'D11111' union all
select N'C',N'C1',N'C11111',N'C11111' union all
select N'C',N'C2',N'C22222',N'C22222' union all
select N'E',N'E1',N'E11111',N'E11111'
Go

;with C
as
(
select
tb1.ITEMNO,tb1.ITEMCODE,tb2.EX,tb1.ITEMNAME,tb1.MEMO ,row=row_number()over(partition by tb1.[ITEMNO] order by tb1.[ITEMNO],tb2.[ITEMCODE])
from tb1
inner join tb2 on tb1.[ITEMCODE]=tb2.[ITEMCODE]
)
select
ITEMNO=case when row=1 then rtrim(ITEMNO) else '' end,ITEMCODE=case when row=1 then ITEMCODE else '' end,EX,ITEMNAME,MEMO
from
c
order by c.ITEMNO,row
TGZ 2009-03-18
  • 打赏
  • 举报
回复
重新排一下,不知道好不好点

tb1
--------------------------------------------
ITEMNO ITEMCODE EX ITEMNAME MEMO
1 D DX DDDD DDDD
2 C CX CCCC CCCC
3 B BX BBBB BBBB
4 E EX EEEE EEEE
.......


tb2
--------------------------------------------
ITEMCODE EX EX_Name EX_MEMO
E E1 E11111 e111111
D D1 D11111 D11111
C C1 C11111 C11111
C C2 C22222 C22222
E E1 E11111 E11111


要求结果:
--------------------------
ITEMNO ITEMCODE EX ITEMNAME MEMO
1 D DX DDDD DDDD
D1 D111 D111
2 C CX CCCC CCCC
C1 C111 C111
C2 C222 C222
3 B BX BBBB BBBB
4 E EX EEEE EEEE
E1 E111 E111
.......

dawugui 2009-03-18
  • 打赏
  • 举报
回复
这个需求很怪.
百年树人 2009-03-18
  • 打赏
  • 举报
回复
---测试数据---
if object_id('[tb1]') is not null drop table [tb1]
go
create table [tb1]([ITEMNO] int,[ITEMCODE] varchar(1),[EX] varchar(2),[ITEMNAME] varchar(4),[MEMO] varchar(4))
insert [tb1]
select 1,'D','DX','DDDD','DDDD' union all
select 2,'C','CX','CCCC','CCCC' union all
select 3,'B','BX','BBBB','BBBB' union all
select 4,'E','EX','EEEE','EEEE'
if object_id('[tb2]') is not null drop table [tb2]
go
create table [tb2]([ITEMCODE] varchar(1),[EX] varchar(2),[EX_Name] varchar(6),[EX_MEMO] varchar(7))
insert [tb2]
select 'E','E1','E11111','e111111' union all
select 'D','D1','D11111','D11111' union all
select 'C','C1','C11111','C11111' union all
select 'C','C2','C22222','C22222' union all
select 'E','E1','E11111','E11111'

---查询---
select ITEMNO,ITEMCODE,EX,ITEMNAME,MEMO
from(
select
itemno as px,
case when ex like '%X' then ltrim(itemno) else '' end as ITEMNO,
case when ex like '%X' then ITEMCODE else '' end as ITEMCODE,
EX,
ITEMNAME,
MEMO
from
(
select * from tb1 union all
select tb1.itemno,tb2.* from tb2 left join tb1 on tb1.itemcode=tb2.itemcode
) t
) tt
order by px,case when ex like '%X' then 1 else 2 end


---结果---
ITEMNO ITEMCODE EX ITEMNAME MEMO
------------ -------- ---- -------- -------
1 D DX DDDD DDDD
D1 D11111 D11111
2 C CX CCCC CCCC
C1 C11111 C11111
C2 C22222 C22222
3 B BX BBBB BBBB
4 E EX EEEE EEEE
E1 E11111 e111111
E1 E11111 E11111

(所影响的行数为 9 行)
TGZ 2009-03-18
  • 打赏
  • 举报
回复
怎么回事,在编辑的时候,上面的对齐很好,提交后,都对不齐了
htl258_Tony 2009-03-18
  • 打赏
  • 举报
回复
josy已经在另一贴写好了.
TGZ 2009-03-18
  • 打赏
  • 举报
回复
tb1
--------------------------------------------
ITEMNO ITEMCODE EX ITEMNAME MEMO
1 D DX DDDD DDDD
2 C CX CCCC CCCC
3 B BX BBBB BBBB
4 E EX EEEE EEEE
.......


tb2
--------------------------------------------
ITEMCODE EX EX_Name EX_MEMO
E E1 E11111 e111111
D D1 D11111 D11111
C C1 C11111 C11111
C C2 C22222 C22222
E E1 E11111 E11111


要求结果:
--------------------------
ITEMNO ITEMCODE EX ITEMNAME MEMO
1 D DX DDDD DDDD
D1 D111 D111
2 C CX CCCC CCCC
C1 C111 C111
C2 C222 C222
3 B BX BBBB BBBB
4 E EX EEEE EEEE
E1 E111 E111

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧