2 leihuashang leihuashang 于 2016.03.11 09:15 提问

sql 表连接后数据去除重复的内容

有个A表
订单号 入住人
1 张1
1 王1
2 张2
3 张3
有个B表
订单号 入住房间号
1 201
1 202
两个表的订单号是相同的

现在想得到表
订单号 入住人 房间号
1 张1 201
1 王1 202
2 张2 null
3 张3 null

请问改如何写

6个回答

zyl_leilei
zyl_leilei   2016.03.11 11:37
已采纳

关键问题是你的订单号比如1,入住了两个人,分别开了两个房间,但问题是哪个人是201房间,哪个人是202房间没有对应。这个人和房间的对应关系是怎样的?

leihuashang
leihuashang 没有对应关系,单不能两个人去一个房间
接近 2 年之前 回复
danielinbiti
danielinbiti   Ds   Rxr 2016.03.11 09:20

这是同一个订单一一对应分配的事吧,不是去重的问题
参见
http://blog.csdn.net/danielinbiti/article/details/43231879

leihuashang
leihuashang 回复danielinbiti: 谢谢你 我是说如果实现我的这个,你那个没有临时表是因为第一张表就是需要的已经把列有了,直接update就好了。看了你的有了一个思路。通过其他方法实现了
接近 2 年之前 回复
danielinbiti
danielinbiti 回复清明_: 没见临时表,就是sql实现,你没看完
接近 2 年之前 回复
leihuashang
leihuashang 你的意思先做一个临时表,然后遍历表查询b表向临时表中插入
接近 2 年之前 回复
tangys623656350
tangys623656350   2016.03.11 09:54

select * from 表A A1 left join 表B B1 on A1.订单号=B1.订单号 这样就可以得到你想要的数据了

leihuashang
leihuashang 你的这个得到的数据比较多 有冲突的
接近 2 年之前 回复
zyl_leilei
zyl_leilei   2016.03.11 12:01

WITH A(ddh,name)AS(
SELECT 1,'张1' UNION ALL
SELECT 1,'王1' UNION ALL
SELECT 2,'张2' UNION ALL
SELECT 3,'张3'
),
B(ddh,fjh)AS(
SELECT 1,'201' UNION ALL
SELECT 1,'202'
)

select * from
(
select ,ROW_NUMBER() over(partition by ddh,fjh order by fjh) as id from
(select A.
,B.fjh from A left join B on a.ddh=b.ddh) as table1
) as table2 where id=1

你试试看,应该是你要的结果。

leihuashang
leihuashang 谢谢你 我弄好了 和你的方法有点像
接近 2 年之前 回复
Royal_lr
Royal_lr   Ds   Rxr 2016.03.11 13:25

去除重复的话,用distinct就行了

leihuashang
leihuashang   2016.03.11 14:42

我的实现方法 提供个大家参考,不是最好的,只提供一种思路

谢谢那些帮助我的人

DECLARE @A TABLE (orderid INT , NAME VARCHAR(30))
INSERT INTO @A
( orderid, NAME )
VALUES ( 1, -- orderid - int
'张1' -- NAME - varchar(30)
)
,( 1, -- orderid - int
'王1' -- NAME - varchar(30)
)
,( 2, -- orderid - int
'张2' -- NAME - varchar(30)
)
,( 3, -- orderid - int
'张3' -- NAME - varchar(30)
) ,( 1, -- orderid - int
'李1' -- NAME - varchar(30)
)

DECLARE @B TABLE (orderid INT , host VARCHAR(30))

INSERT INTO @B
( orderid, host )
VALUES ( 1, -- orderid - int
'201' -- host - varchar(30)
)

,(1, -- orderid - int
'202' -- host - varchar(30)
)

,(1, -- orderid - int
'203' -- host - varchar(30)
)

      SELECT * FROM @A

      SELECT * FROM @B

      -- DROP TABLE #temp
      SELECT * INTO #temp FROM (
      SELECT ROW_NUMBER() OVER (ORDER BY A.orderid) id,A.orderid,A.NAME , b.host FROM @A  A LEFT JOIN  @B B  ON A.orderid = B.orderid  
      ) T  

      SELECT * FROM #temp

      SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY host)  nameid, ROW_NUMBER() OVER (PARTITION BY host ORDER BY NAME)  hostid, * INTO #temp2 FROM #temp   

      SELECT NAME,host ,orderid FROM #temp2 WHERE nameid = hostid  AND host IS NOT NULL
      UNION ALL
      SELECT  NAME,host ,orderid FROM #temp2 WHERE host IS NULL
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!