台灣最大程式設計社群網站
線上人數
788
 
會員總數:240323
討論主題:186326
歡迎您免費加入會員
討論區列表 >> MS SQL >> MS SQL full join問題
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
MS SQL full join問題
價值 : 20 QP  點閱數:292 回應數:5

樓主

郭孝直
初學者
50 90
1204 144
發送站內信

--MS SQL full join問題
declare @t1 table (f1 nvarchar(50), f2 nvarchar(50))
declare @t2 table (f1 nvarchar(50), f3 nvarchar(50))
declare @t3 table (f1 nvarchar(50), f4 nvarchar(50))
insert into @t1 (f1,f2) values ('a','1')
insert into @t1 (f1,f2) values ('c','2')
insert into @t1 (f1,f2) values ('d','3')
insert into @t2 (f1,f3) values ('a','4')
insert into @t2 (f1,f3) values ('b','5')
insert into @t2 (f1,f3) values ('d','6')
insert into @t3 (f1,f4) values ('c','7')
insert into @t3 (f1,f4) values ('e','8')
--select t1f1=t1.f1,t2f1=t2.f1,t3f1=t3.f1,f2,f3,f4
select f1=isnull(t1.f1,isnull(t2.f1,t3.f1)),f2,f3,f4
from @t1 t1
full join @t2 t2 on t1.f1=t2.f1
full join @t3 t3 on t2.f1=t3.f1
order by f1
上列結果如圖1,f1的值有'c'重複
如何能有圖2的結果? (f1不要重複)
我知道改成
select f1=isnull(t1.f1,isnull(t2.f1,t3.f1)),f2,f3,f4
from @t1 t1
full join @t2 t2 on t1.f1=t2.f1
full join @t3 t3 on t1.f1=t3.f1
order by f1
能達到目的,但這是巧合,不保險,
因為實務上各table值很多,無法一一去檢查有哪些會沒對應到
請問有沒有治本之道?

圖:
https://drive.google.com/file/d/0B43q2SqHw8xcUlRZVnZuaHViUjQ/view





搜尋相關Tags的文章: [ full join ] ,
本篇文章發表於2017-01-23 14:20
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
最有價值解答

Daimom
捐贈 VP 給 Daimom 檢舉此回應
不知道這樣行不行,但我把字串轉成數字了...如果你的f2 ,f3,f4是字串的話......我在想想XD

本篇文章回覆於2017-01-23 15:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

郭孝直
檢舉此回應
後來我也有想到union的方式
謝謝你!
本篇文章回覆於2017-01-24 10:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
alter procedure p_test
as
declare @t1 table (f1 nvarchar(50), f2 nvarchar(50))
declare @t2 table (f1 nvarchar(50), f3 nvarchar(50))
declare @t3 table (f1 nvarchar(50), f4 nvarchar(50))
insert into @t1 (f1,f2) values ('a','1')
insert into @t1 (f1,f2) values ('c','2')
insert into @t1 (f1,f2) values ('d','3')
insert into @t2 (f1,f3) values ('a','4')
insert into @t2 (f1,f3) values ('b','5')
insert into @t2 (f1,f3) values ('d','6')
insert into @t3 (f1,f4) values ('c','7')
insert into @t3 (f1,f4) values ('e','8')

select distinct f1,f2 into #temp from @t1
insert #temp
select distinct f1,null from @t2 where f1 not in(select distinct f1 from #temp)
insert #temp
select distinct f1,null from @t3 where f1 not in(select distinct f1 from #temp)

alter table #temp add f3 nvarchar(50) null
alter table #temp add f4 nvarchar(50) null


update t1 set t1.f3=t2.f3 from #temp t1 join @t2 t2 on t1.f1=t2.f1
update t1 set t1.f4=t2.f4 from #temp t1 join @t3 t2 on t1.f1=t2.f1

select * from #temp order by f1
本篇文章回覆於2017-01-24 11:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
塞成同一張表來做...原來如此,受教了m(_ _)m
本篇文章回覆於2017-01-24 14:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

郭孝直
檢舉此回應
感謝各位指導!
本篇文章回覆於2017-01-25 14:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

回覆
如要回應,請先登入.