iT邦幫忙

0

SQL SERVER資料庫語法問題

2個資料庫
A資料庫有:老師、學生、成績
B資料庫有:老師、科目

因為小明老師還在輸入成績,但最後還是要顯示出小明老師資料

A資料庫 [TableA]成績

小王、A、15
小王、B、30
小王、C、40

小白、A、20
小白、B、30
小白、C、40

小黑、A、25
小黑、B、30
小黑、C、40

共9筆資料

B資料庫 [TableB]老師名單
小明、國文
小王、數學
小白、英文
小黑、歷史 共4筆資料

兩個table串起來要顯示的資料樣子是

A、小明、國文、NULL
A、小王、數學、15
A、小白、英文、20
A、小黑、歷史、25 共4筆資料

這是我目前碰到問題把他簡略說明一下,不合理地方跟我說一下
如果使用full join會造成資料串錯成迴圈一樣答案
煩惱阿搖頭

看更多先前的討論...收起先前的討論...
外獅佬 iT邦大師 1 級 ‧ 2012-12-06 14:37:30 檢舉
用老師資料表當基準做left join吧
如果連老師資料表都沒有資料
那一定不會有小明老師
ianianwu iT邦研究生 5 級 ‧ 2012-12-06 14:56:21 檢舉
我其實還有還他TABLE,如果真的用了LEFT JOIN一定要做串出條件,要不然最後資料一定亂串,因為我要寫在asp上做處理,怎麼想都不能用這樣搞!!Orz
學生資料表[STUDENT]
A
B
C

老師資料表[TEACHER]
小明、國文
小王、數學
小白、英文
小黑、歷史


SELECT * FROM TEACHER, STUDENT
再加入[TableA]成績條件

手邊沒有SQL Server可用
無法寫出SQL指令
臉紅
外獅佬 iT邦大師 1 級 ‧ 2012-12-06 15:18:39 檢舉
LEFT JOIN本來就應該要有串接的條件...
ianianwu iT邦研究生 5 級 ‧ 2012-12-06 15:22:20 檢舉
謝謝恩,雖然是搞出重點答案了,現在是煩惱要怎麼寫在ASP上了,還有一些答案還在想要怎麼弄出來,一加條件上去就亂七八糟哭
魯大 iT邦高手 1 級 ‧ 2012-12-06 16:44:22 檢舉
如果你的[TableB] 的欄位是這樣的話
小明 國文 A
小王 數學 A
小白 英文 A
小黑 歷史 A
共4筆資料

那就會比較簡單
外獅佬 iT邦大師 1 級 ‧ 2012-12-06 16:47:13 檢舉
一個join打死...拍手讚
summertw iT邦好手 1 級 ‧ 2012-12-06 20:29:08 檢舉
A資料表 [TableA]成績
Fd1 Fd2 Fd3 Fd4
02 小王 A 15
02 小王 B 30
02 小王 C 40
03 小白 A 20
03 小白 B 30
03 小白 C 40
04 小黑 A 25
04 小黑 B 30
04 小黑 C 40
共9筆資料

B資料庫 [TableB]老師名單
Fd1 Fd2 Fd3
01 小明 國文
02 小王 數學
03 小白 英文
04 小黑 歷史
共4筆資料

解法,使用Join
Select [TableA].[Fd3] AS AFd1 , [TableB].[Fd2], [TableB].[Fd3], [TableA].[Fd4]
From [TableB] Left Outer Join [TableA] ON([TableA].[Fd1]= [TableB].[Fd1] And [TableA].[Fd3] = ‘A’)

理論上,按版主所給的條件,不太可能產生【A、小明、國文、NULL】這行答案,我將版主的資料表稍作整理,利用Left outer join來解這題,答案如下四行,若將【 And [TableA].[Fd3] = ‘A’】這個條件拿掉,則應產生12筆資料出來...

NULL、小明、國文、NULL
A、小王、數學、15
A、小白、英文、20
A、小黑、歷史、25 共4筆資料
ianianwu iT邦研究生 5 級 ‧ 2012-12-07 09:45:16 檢舉
對,我串出來答案,我當初認為的key值的確是變成null,因為成績是沒有A,所以A名還是要用其他KEY值串近來,因為這是我把我大問題簡化下來的,所以一定會有一些不合理地方!!汗
summertw iT邦好手 1 級 ‧ 2012-12-07 18:29:49 檢舉
也因版主的鍵值不夠完善,因此若要強迫使用SQL-92的言法去解答,程式會變得冗長而且沒有效率

2 個回答

12
外獅佬
iT邦大師 1 級 ‧ 2012-12-06 15:52:07
最佳解答

這個語法應該可以達到你要的要求

<pre class="c" name="code">SELECT [tb3].[學生],[tb3].[老師],[tb3].[科目],[tb2].[成績] FROM (SELECT [tb1].[學生],[TableB].[老師],[TableB].[科目] FROM (SELECT DISTINCT [TableA].[學生] FROM [TableA]) AS [tb1],[TableB]) [tb3] LEFT JOIN (SELECT [學生],[成績],[老師] FROM [TableA]) AS [tb2] ON [tb3].[學生]=[tb2].[學生] AND [tb3].[老師]=[tb2].[老師]

結果:
學生 老師 科目 成績

A 小明 國文 null
A 小王 數學 15
A 小白 英文 20
A 小黑 歷史 25
B 小明 國文 null
B 小王 數學 30
B 小白 英文 30
B 小黑 歷史 30
C 小明 國文 null
C 小王 數學 40
C 小白 英文 40
C 小黑 歷史 40
感謝海綿寶大廚給的靈感~~~

看更多先前的回應...收起先前的回應...
外獅佬 iT邦大師 1 級 ‧ 2012-12-06 15:54:31 檢舉

一大串的sub-query....暈

明眼人一看就知道
重點在於老師和學生
而不是成績

不過坦白說
這SQL指令我還真寫不出來
臉紅

灑花灑花
L大真厲害 除了做偵探還要寫ASP~~!
比俺這個半吊子的利害多了 簽名

外獅佬 iT邦大師 1 級 ‧ 2012-12-06 16:12:10 檢舉

多虧了大廚把牛給拆解開了...
我只是把拆解開的上等牛肉...弄成了漢堡肉...臉紅

海綿寶寶把牛拆開
L大其實是皮老闆(話題瞬間轉換驚

ianianwu iT邦研究生 5 級 ‧ 2012-12-06 16:23:13 檢舉

wiselou
也真厲害,跟我現在寫的答案很類似,目前這個關卡已經算是結案了
其實我應該要把學生在拆成另外一個table才對,現在我發現要串兩個left join才可能解決我目前現況!!
這已經算是另外一個問題,就先把這關給結案!!

ianianwu iT邦研究生 5 級 ‧ 2012-12-06 16:24:48 檢舉

Orz居然要六小時才能結案,就稍微等一下吧暈
繼續完成我的工作搖頭

外獅佬 iT邦大師 1 級 ‧ 2012-12-06 16:45:28 檢舉

chingfeng提到:
其實是皮老闆

噓....不可以給蟹老闆聽到....駭客

ianianwu iT邦研究生 5 級 ‧ 2012-12-06 17:21:30 檢舉

哈~各位我SQL完工了開心
結果ASP因為判斷空值或者型態上有問題,目前還在debug中倒

抱歉ASP的問題俺不會(淚奔哭逃跑

外獅佬 iT邦大師 1 級 ‧ 2012-12-07 09:10:50 檢舉

ianianwu提到:
判斷空值

這種狀況,通常我不會讓成績欄位保持null,而會讓它變成-1(因為,分數頂多就是0分)
這樣,基本上不會有判斷null的問題,也就是成績是-1分時,表示老師尚未輸入成績。
這樣程式會容易處理許多。

外獅佬 iT邦大師 1 級 ‧ 2012-12-07 09:12:46 檢舉

再說...ASP 不是有 IsNull函數可以用的嗎?

ianianwu iT邦研究生 5 級 ‧ 2012-12-07 09:18:18 檢舉

有,我改採用兩段是判斷,螢幕顯示空值,計算分開來,讓計算再另外一段去做處理,就不用修改太多!!

6
老鷹(eagle)
iT邦高手 1 級 ‧ 2012-12-06 14:58:09

感覺兩個資料表少了關連性
譬如俺再設定表單假如有需要跟另一個資料表關聯的話
SQL 因該是join 不過俺好像沒有用過~~!哈哈
tableA(學生)
流水編號 等級 姓名 分數 老師的流水編號

tableB(老師)
流水編號 姓名 科目

俺資料庫會這樣設計

看更多先前的回應...收起先前的回應...
ianianwu iT邦研究生 5 級 ‧ 2012-12-06 15:02:04 檢舉

那個KEY值是有,我只是沒有寫出來,想說先舉例唯一相關值比較好對應,畢竟我有6個TABLE在串資料,真正再互串的是有2個,成績跟老師而已,所以我在想只要把這兩個JOIN搞定,其他應該不會影響到

http://www.1keydata.com/tw/sql/sqljoins.html
JOIN俺不熟不過有教學 看有沒有幫助到你
太久沒寫程式了 最近以研究技術為主Orz

俺用俺的MYSQL測試一下好了~~!

ianianwu iT邦研究生 5 級 ‧ 2012-12-06 15:26:55 檢舉

謝謝
我剛才想到串出了一些重點答案,現在要把其他table答案都加進去,更煩惱是要怎麼寫上ASP了無言

俺是合併OK 不過還沒下條件

<pre class="c" name="code">
SELECT A1.`Name`,A2.`account` FROM `history` as `A1`,`users` as `A2` 

俺以PHP來說
先把合併表單塞進陣列
再把陣列串出來
下判斷 因該可能也許或者是這樣....

我要發表回答

立即登入回答