台灣最大程式設計社群網站
線上人數
1446
 
會員總數:244789
討論主題:188837
歡迎您免費加入會員
討論區列表 >> MS SQL >> JOIN 後保留NULL 的欄位
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
JOIN 後保留NULL 的欄位
價值 : 5 QP  點閱數:1225 回應數:13

樓主

高俊海
門外漢
0 1
36 6
發送站內信

請問各位:

TABLE A TABLE B
========== ================
ID TYPE TYPE NAME QTY
1 AC AC 手套 20
2 DC AC 眼鏡 10
DC 手套 30

希望的結果
TABLE
======================
TYPE NAME QTY
AC 手套 20
DC 手套 10
AC 眼鏡 30
DC 眼鏡 0 <---此筆資料是JOIN 後要產出的



這樣的結果只會出現B的資料,但我想得到已A的TYPE為基底,任何TABLE跟A串時,每個NAME都要存在TYPE類型,如果不存在QTY給0

不知道要如何達到這樣的效果,謝謝

搜尋相關Tags的文章: [ JOIN ] , [ NULL值 ] ,
本篇文章發表於2016-04-20 10:39
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

彩虹
檢舉此回應
乖乖的新增一列「DC 眼鏡 0」吧




本篇文章回覆於2016-04-20 10:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

高俊海
檢舉此回應
回復 彩虹:

手動新增一筆???不是吧~~
本篇文章回覆於2016-04-20 10:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

彩虹
檢舉此回應
不是吧???? 你的需求很不合邏輯阿
你有搞懂left join嗎?

況且
我也不知道你用join幹嘛 = =
你的Table B已經完整呈現了

TABLE B
----------
TYPE | NAME | QTY
----------
AC | 手套 | 20
AC | 眼鏡 | 10
DC | 手套 | 30
本篇文章回覆於2016-04-20 10:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

高俊海
檢舉此回應
可能我題意不清

TABLE A
==========
ID TYPE
1 AC
2 DC

TABLE B
================
TYPE NAME QTY
AC 手套 20
DC 手套 30
AC 眼鏡 10

希望的結果
TABLE
======================
TYPE NAME QTY
AC 手套 20
DC 手套 10
AC 眼鏡 30
DC 眼鏡 0 <---此筆資料是JOIN 後要產出的

希望B能以A的type為基底,不論B的name有無type,皆要有AC,DC...
也就是 不論手套 眼鏡 都需要 AC,DC

你要我自己手動新增一筆DC 眼鏡 0????
本篇文章回覆於2016-04-20 11:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

彩虹
檢舉此回應
先題外話,你連「希望的結果」資料都打錯了....
DC 手套 什麼時候變10 ((不是30嗎?
AC 眼鏡 怎麼會變成30 ((不是10嗎?

正題

不是你題意不清,而是你了解SQL不清


我這麼說好了
你不覺得你應該在新增TYPE得時候
就應該要寫好同時(同步)新增手套(數量)、眼鏡(數量)

例如:
如果多了一個TC的TYPE,是不是在新增TC類型的時候,就要同步將這兩個新增上去,數量預設為0
TC 手套 0
TC 眼鏡 0
本篇文章回覆於2016-04-20 11:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

彩虹
檢舉此回應
我在說明一點

如果Table B長這樣 (只有一筆資料)

TABLE B
================
TYPE NAME QTY
AC 手套 20

你覺得left join之後,他會變成你希望的結果嗎????
TABLE
======================
TYPE NAME QTY
AC 手套 20
DC 手套 0
AC 眼鏡 0
DC 眼鏡 0

我先告訴你,這是不可能的
他根本不知道你有眼鏡,甚至如果以後出現帽子,他也不知道
本篇文章回覆於2016-04-20 11:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

高俊海
檢舉此回應
所以照您的意思 sql 做不到囉~~

必須手動新增到table的意思嗎??
本篇文章回覆於2016-04-20 11:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

高俊海
檢舉此回應
補充:

不一定非用join 不可,亦可利用case when 等其他技術
本篇文章回覆於2016-04-20 11:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
最有價值解答

Daimom
捐贈 VP 給 Daimom 檢舉此回應
這題目很好玩。如上所述,電腦不會知道DC 裡面有沒有眼鏡,所以你要先建好 AC 跟DC 裡面有幾種配套方式。
再用left join去做

本篇文章回覆於2016-04-20 15:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

高俊海
檢舉此回應
感謝各位回復:

此問題,我已想到如何解決,需經過多是TABLE的轉換,達到目的,雖說不一定是好方法,但
1.這真的需要使用"JOIN"的方式
2.絕對不是"手動新增資料",假設我在B新增一筆"外套 AC 30",難道要順便新增一筆 "外套 DC 0"的資料??? 這應該不是很聰明的方式


謝謝



本篇文章回覆於2016-04-20 16:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

彩虹
檢舉此回應
9樓已經給你正確答案了

第9~11行
本篇文章回覆於2016-04-20 16:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

高俊海
檢舉此回應
雖說跟我的做法不同,但結果是一樣,所以能仍感謝二位(Daimom,彩虹)的指導~~~謝謝
本篇文章回覆於2016-04-22 09:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

純真的人
捐贈 VP 給 純真的人 檢舉此回應
無聊回來~閒晃一下~@@

其實你缺的是用第三表來顯示而已~

如果只有A,B兩表,當然是沒有【DC 眼鏡 0】



如果你加入第3表,就可以出現你要的結果~


以上是手動測試的~

如果是已經存在資料表的寫法應該是如下:

本篇文章回覆於2016-04-23 10:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

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