有个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
请问改如何写
关键问题是你的订单号比如1,入住了两个人,分别开了两个房间,但问题是哪个人是201房间,哪个人是202房间没有对应。这个人和房间的对应关系是怎样的?
这是同一个订单一一对应分配的事吧,不是去重的问题
参见
http://blog.csdn.net/danielinbiti/article/details/43231879
select * from 表A A1 left join 表B B1 on A1.订单号=B1.订单号 这样就可以得到你想要的数据了
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
你试试看,应该是你要的结果。
去除重复的话,用distinct就行了
我的实现方法 提供个大家参考,不是最好的,只提供一种思路
谢谢那些帮助我的人
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