全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4396
推到 Plurk!
推到 Facebook!

不管有沒有該品號,都需顯示出資料

答題得分者是:bestlong
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-09-13 15:26:29 IP:59.120.xxx.xxx 未訂閱
小弟請教有關SQL語法查詢資料的問題
如何在A資料表、B資料表中
查詢出"不管有沒有該品號,都需顯示出資料"
舉例來說~
在A資料表、B資料表中都有個產品編號欄位
而我現在的需求是不管A或B的資料表中有沒有 00001 的產品編號
都得顯示出來
因為可能某一資料表中是沒有該品號的
所以顯示出來的結果應該為以下其中一種:
1.
A.產品編號B.產品編號
0000100001

2.
A.產品編號B.產品編號
00001

3.
A.產品編號B.產品編號
00001

4.
A.產品編號B.產品編號

因小弟用了一些查詢語法
結果還是不得其解
所以上來問問看
看是不是有別的解法

ps:
1. 小弟是以A資料表為主,然後與B資料表做關聯查詢
(Select A.產品編號, B.產品編號 From A Left join B on ...)
2. 小弟用的是MS-SQL

編輯記錄
老大仔 重新編輯於 2011-09-13 01:27:34, 註解 無‧
老大仔 重新編輯於 2011-09-13 01:30:04, 註解 無‧
老大仔 重新編輯於 2011-09-13 01:32:23, 註解 無‧
老大仔 重新編輯於 2011-09-13 01:38:17, 註解 無‧
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-09-13 16:11:27 IP:117.19.xxx.xxx 訂閱
咦??
欄位不管有沒有值 只要條件符合
不是應該就會SELECT出該筆資料嗎 就算某幾個欄位是NULL 也是會帶出那幾個欄位阿.......
還是我會錯意了 @@??
除非你是用產品編號欄位做(SELECT 條件) OR (JOIN 條件)??
===================引 用 老大仔 文 章===================
小弟請教有關SQL語法查詢資料的問題
如何在A資料表、B資料表中
查詢出"不管有沒有該品號,都需顯示出資料"
舉例來說~
在A資料表、B資料表中都有個產品編號欄位
而我現在的需求是不管A或B的資料表中有沒有 00001 的產品編號
都得顯示出來
因為可能某一資料表中是沒有該品號的
所以顯示出來的結果應該為以下其中一種:
1.
A.產品編號B.產品編號
0000100001

2.
A.產品編號B.產品編號
00001

3.
A.產品編號B.產品編號
00001

4.
A.產品編號B.產品編號

因小弟用了一些查詢語法
結果還是不得其解
所以上來問問看
看是不是有別的解法

ps:
1. 小弟是以A資料表為主,然後與B資料表做關聯查詢
(Select A.產品編號, B.產品編號 From A Left join B on ...)
2. 小弟用的是MS-SQL

------
天行健
君子當自強不息~~@.@
編輯記錄
T.J.B 重新編輯於 2011-09-13 02:14:24, 註解 無‧
T.J.B 重新編輯於 2011-09-13 02:15:53, 註解 無‧
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-09-14 09:22:31 IP:210.242.xxx.xxx 訂閱
這樣的描述感覺很混亂,用下列簡單資料表來說明

產品資料表
table item (
item_no,
item_name
)

訂單明細
table order_detail (
order_no,
item_no,
qty
)

基本上訂單明細會拉產品資料

select A.* , B.item_name
from order_detail A
join item B on(A.item_no=B.item_no)

但是這樣當產品資料不見的時候,該筆訂單明細也不會顯示

select A.* , B.item_name
from order_detail A
left join item B on(A.item_no=B.item_no)

改成 left join 就可以顯示訂單明細但產品名稱是空的

會有這樣的需求,絕大多數是程式處理刪除資料時沒有檢查關聯性
而且資料庫結構也沒有設定外鍵來限制有被參考的資料不可刪除
所以造成很多後遺症
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-09-14 10:07:57 IP:59.120.xxx.xxx 未訂閱
 isnull(a.field, 'ABC')

這樣應該行得通
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-09-15 09:57:52 IP:114.43.xxx.xxx 訂閱
select * from (select distinct  R.OrderNo from (select distinct A.OrderNo from A union select distinct B.OrderNo from B) R) OrderNoList Left Join B on (OrderNoList.OrderNo = B.OrderNo);

未經測試的暴力解
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-09-16 10:16:20 IP:59.120.xxx.xxx 未訂閱
To T.J.B 大大:

我的表達功力有待加強
請多多擔待><

一般的狀況下是這樣沒錯
正常的狀況下是:
"當主要的資料表(A)沒有該產品編號
那麼被Join進來的資料表(B)中就算有那個產品編號也不會出現"
所以當我剛好是查到該產品編號(有Where條件)的時候
資料就不會出現
但我所需的剛好相反
可是現在的需求就是:
"A表假如沒有該產品編號,而B表有該產品編號,還是要顯示出來"
(就如同我上方表格中的第2點)

所以不管要怎麼查詢
都得是符合我上述的四種情況(表格)的其中之一:
1. 兩個資料表都有產品邊號
2. A資料表沒有該產品邊號,B資料表有該產品邊號
3. A資料表有該產品邊號,B資料表沒有該產品邊號
4. A和B資料表都沒有該產品邊號


===================引 用 T.J.B 文 章===================
咦??
欄位不管有沒有值 只要條件符合
不是應該就會SELECT出該筆資料嗎 就算某幾個欄位是NULL 也是會帶出那幾個欄位阿.......
還是我會錯意了 @@??
除非你是用產品編號欄位做(SELECT 條件) OR (JOIN 條件)??

老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-09-16 10:31:27 IP:59.120.xxx.xxx 未訂閱
To bestlong 大大:

您說的小弟了解
可是現在的需求是當主要的資料表沒有該item_no時
還是得顯示出來(我表格中的第2個)

那我這樣說好了
產品庫存資料表:
Table Stock(item_no, item_name, item_amount)

產品資料表
Table Product(item_no, item_name)

Select A.item_no, B.item_no
From Stock A
Left Join Product B on A.item_no = B.item_no

這樣的狀況下
假如 product 沒有該 item_no 的話會是Null值
(這很正常)
可是我的需求是相反的:
假如 Stock 沒有 item_no 而Product有該item_no時,
就顯示表格2的內容

相當於:
Select A.item_no, B.item_no
From Stock A
Left Join Product B on A.item_no = B.item_no
Where A.item_no = '00001' or B.item_no = '00001'

不知道這樣講容不容易懂@@

===================引 用 bestlong 文 章===================
這樣的描述感覺很混亂,用下列簡單資料表來說明

產品資料表
table item(
item_no,
item_name
)

訂單明細
table order_detail (
order_no,
item_no,
qty
)

基本上訂單明細會拉產品資料

select A.* , B.item_name
from order_detailA
join item Bon(A.item_no=B.item_no)

但是這樣當產品資料不見的時候,該筆訂單明細也不會顯示

select A.* , B.item_name
from order_detailA
left join item Bon(A.item_no=B.item_no)

改成 left join 就可以顯示訂單明細但產品名稱是空的

會有這樣的需求,絕大多數是程式處理刪除資料時沒有檢查關聯性
而且資料庫結構也沒有設定外鍵來限制有被參考的資料不可刪除
所以造成很多後遺症
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-09-16 10:41:41 IP:59.120.xxx.xxx 未訂閱
To GrandRURU 大大:
應該行不通><

===================引 用 GrandRURU 文 章===================
isnull(a.field, 'ABC')

這樣應該行得通
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-09-16 10:42:49 IP:59.120.xxx.xxx 未訂閱
To Coffee 大大:
這爆力解似乎怪怪的@@
A union B 時
假如 A 沒有 OrderNo 而 B 有 OrderNo 時
結果(R)會是只有 B 的資料
然後外層又 Left Join B
所以應該會變成是B Left Join B
這樣A還是沒有出現@@




===================引 用 Coffee 文 章===================
select * from (select distinct R.OrderNo from (select distinct A.OrderNo from A union select distinct B.OrderNo from B) R) OrderNoList Left Join B on (OrderNoList.OrderNo = B.OrderNo);

未經測試的暴力解
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-09-16 10:45:15 IP:220.130.xxx.xxx 訂閱
Sorry, 這個有點寫錯了:P
OrderNoList會有A跟B表的所有OrderNo,然後我原先假設你要取的不是列表而是各OrderNo的總數,所以Left join B應該改成left join (select OrderNo, Count(*) from B group by OrderNo)
所以你想要的是列表嗎?

===================引 用 老大仔 文 章===================
To Coffee 大大:
這爆力解似乎怪怪的@@
A union B 時
假如 A 沒有 OrderNo 而 B 有 OrderNo 時
結果(R)會是只有 B 的資料
然後外層又 Left Join B
所以應該會變成是B Left Join B
這樣A還是沒有出現@@




===================引 用 Coffee 文 章===================
select * from (select distinct R.OrderNo from (select distinct A.OrderNo from A union select distinct B.OrderNo from B) R) OrderNoList Left Join B on (OrderNoList.OrderNo = B.OrderNo);

未經測試的暴力解
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2011-09-15 20:46:30, 註解 無‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-09-16 11:08:44 IP:59.120.xxx.xxx 未訂閱
To Coffee 大大: 
大大不用道歉啦
是我自己沒有說明的很清楚><

是的,我要的只是個列表
就某兩個資料表的兩個欄位資料
詳細內容可以您可以參照我回 bestlong 大大的文~

===================引 用 Coffee 文 章===================
Sorry, 這個有點寫錯了:P
OrderNoList會有A跟B表的所有OrderNo,然後我原先假設你要取的不是列表而是各OrderNo的總數,所以Left join B應該改成left join (select OrderNo, Count(*) from B group by OrderNo)
所以你想要的是列表嗎?

編輯記錄
老大仔 重新編輯於 2011-09-15 21:09:05, 註解 無‧
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2011-09-17 16:18:22 IP:122.117.xxx.xxx 訂閱
應該研究一下 join 的所有語法
處理多資料表連結有 full join (或是 full outer join)語法可以用
如果資料庫有支援的話就可以用
這樣 A 與 B 資料表兩邊所有資料都會列出,相同的產品編號就顯示同一列

[code sql]
select a.*, b.*
from TableA as a
full join TableB as b on(a.item_no=b.item_no)
[/code]

如果你的需求是 A 資料表的子集合去結合 B 資料表的全部資料
這樣就要兩段處理然後 union 合併

[code sql]
select a.*, b.*
from TableA as a
left join TableB as b on(a.item_no=b.item_no)
where a.order_no ='XXX'

union

select a.*, b.*
from TableB as b
left join TableA as a on(b.item_no=a.item_no)
where a.item_no is null
[/code]

第一段會拉出
1. A 有且 B 也有的資料
2. A 有而 B 沒有的資料

第二段會拉出
1. A 沒有而 B 有的資料

而兩邊都沒有的資料當然怎麼 select 就是沒有

以上就看你覺得那個方法適用
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
編輯記錄
bestlong 重新編輯於 2011-09-17 02:19:52, 註解 無‧
bestlong 重新編輯於 2011-09-17 02:33:39, 註解 無‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#13 引用回覆 回覆 發表時間:2011-09-19 17:41:06 IP:59.120.xxx.xxx 未訂閱
To bestlong 大大:

謝謝大大還特地的研究了Join語法
您提供的方法已經幾乎可以用了
只不過您的第二個SQL語法中可能會有個查詢上的漏洞:
當 A 有 00001 而 B 沒有 00001 時
且 B 也剛好有 00002 而 A 卻沒有 00002 時
查詢結果會是:
00001 NULL
Null 00002

原因是在第二段的Where條件是: a.item_no is null
假如改成是 b.item_no = 'XXX'時就會符合我的問題解決方案

所以我修改後的SQL是:
Select a.*, b.*
From TableA As a
Left Join TableB As b On(a.item_no = b.item_no)
Where a.item_no ='XXX'
Union
Select a.*, b.*
From TableB As b
Left Join TableA As a On(b.item_no = a.item_no)
Where b.item_no ='XXX'

結果居然是用倒過來Join就可以解決了
小弟我怎麼沒想到><

===================引 用 bestlong 文 章===================
應該研究一下 join 的所有語法
處理多資料表連結有 full join (或是 full outer join)語法可以用
如果資料庫有支援的話就可以用
這樣 A 與 B 資料表兩邊所有資料都會列出,相同的產品編號就顯示同一列

[code sql]
select a.*, b.*
from TableA as a
full join TableB as b on(a.item_no=b.item_no)
[/code]

如果你的需求是 A 資料表的子集合去結合 B 資料表的全部資料
這樣就要兩段處理然後 union 合併

[code sql]
select a.*, b.*
from TableA as a
left join TableB as b on(a.item_no=b.item_no)
where a.order_no ='XXX'

union

select a.*, b.*
from TableB as b
left join TableA as a on(b.item_no=a.item_no)
where a.item_no is null
[/code]

第一段會拉出
1. A 有且 B 也有的資料
2. A 有而 B 沒有的資料

第二段會拉出
1. A 沒有而 B 有的資料

而兩邊都沒有的資料當然怎麼 select 就是沒有

以上就看你覺得那個方法適用
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#14 引用回覆 回覆 發表時間:2011-09-20 10:53:02 IP:210.242.xxx.xxx 訂閱
我是建議你可以更深入研究 join 的操作

其實第二段也是可以不用 table 調位直接改成 right join 也可以
我所提的方式只是一個基礎與技巧

使用 select a.*, b.* 會有下列結果本來就是必然的
00001 NULL
Null 00002
只需要再用 isnull() 將所有欄位再加工過就好

不過
你自己調整的方式如果是將

where a.item_no is null 直接改成 where b.item_no ='XXX'

會變成第一段 A 與 B 已經對應的資料在第二段 B 與 A 對應的又出現一次,會有資料重複的狀況。

應該可以改成下列會更精準

where (a.item_no is null) and (b.item_no ='XXX')
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#15 引用回覆 回覆 發表時間:2011-09-26 08:52:32 IP:59.120.xxx.xxx 未訂閱
To bestlong 大大:
嗯~用 Right Join 也可以代替這小弟知道
只是當時想說就以 Left join 來討論即可^^
所以就沒有PO上 Right Join 的語法上來
小弟後來也是用 where (a.item_no is null) and (b.item_no ='XXX')
來讓資料更準確^^

因最近有點忙
所以比較慢上來回應此篇文章
目前小弟的問題已經解決
謝謝各位前輩們的指點^^

小弟在此先行結案了^^
熾冰
一般會員


發表:29
回覆:21
積分:10
註冊:2004-01-12

發送簡訊給我
#16 引用回覆 回覆 發表時間:2011-09-29 11:47:34 IP:220.130.xxx.xxx 訂閱
以SQL Join 功能來說
Left Jion 是以左邊Table資料為主體,右邊Table資料為輔助
所以存在左邊Table 資料而且依 on 內部條件 過濾右邊Table
Right Join 則是反其道而行

還有一種是Join 他有默許指令 Full
(Full) Join 是只要是存在於左邊或者右邊Table 資料 皆顯示出來
符合 on 內部條件者 合成一筆紀錄,不符合者獨立顯示為一筆紀錄

我覺得你的問題是用 join 指令
再使用Where 條件過濾掉你不要的資料
編輯記錄
熾冰 重新編輯於 2011-09-28 21:48:18, 註解 無‧
系統時間:2024-04-24 4:53:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!