JOIN 語法的問題 |
缺席
|
cwc65536
初階會員 發表:47 回覆:121 積分:48 註冊:2004-10-14 發送簡訊給我 |
D5 , 資料庫 是 dbisam 有兩個 Table , A 及 B
我現在錯在 : 當 B 的 join key 有兩筆時, 就會變成 query 出 11 筆 正確應該是 : 查詢以 A 為準, 若 A 有 10 筆, 就只要 query 出 10 筆
就算 B 沒有 join key , 該筆 A 也要出來 請問該怎樣修改下面這句 SQL 語法 select *, B.amt from A left join B on (A.INO=B.INO) 另外 join 可分 right , left 再外掛 outer
這中間的差異在哪裏, 看好幾本書, 還是搞不是很懂! 感恩
|
pgdennis
資深會員 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
看到sql沒錯,left join就是這樣...
還是你是想要select *, B.amt from A left join B on (A.INO=B.INO and A.XX=B.XX) outer可以在前面加Left,Right,Full三種
Left就是A方資料全顯示,B方如果沒有和A方有相同Key者,顯示Null
A B 1 1 2 Null 3 3Right就是反過來 Full就是left right A B Null 1 2 null 3 3星期一,星期二...星期日..星期一..無窮迴圈@@
------
星期一,二...無窮迴圈@@ |
cwc65536
初階會員 發表:47 回覆:121 積分:48 註冊:2004-10-14 發送簡訊給我 |
|
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
插个花:对于join,pgdennis前辈已经说得很清楚了,连接分为内连接(inner left)和外连接(outer join)。外连接有right , left ,full连接。
Inner Join 的主要精神就是 exclusive , 叫它做排他性吧! 就是讲 Join 规则不相符的资料就会被排除掉, 譬如讲在 a中有一项ino, 没有出现在 b 资料表中, 那么这笔记录便会被排除掉。
outer join 的区别可参考pgdennis前辈所说,小弟再列一些例子:
例如, A表: a0 a1 a2 1 aa aaa 2 bb bbb B表: b0 b1 b2 1 zz zzz 3 yy yyy select a.a1, b.b1 from a inner join b on a.a0=b.b0 1 aa zz select a.a1, b.b1 from a left outer join b on a.a0=b.b0 1 aa zz 2 bb NULL select a.a1, b.b1 from a right outer join b on a.a0=b.b0 1 aa zz 3 NULL yy select a.a1, b.b1 from a full outer join b on a.a0=b.b0 1 aa zz 2 bb null 3 null yy 至于要取消重复的记录,可加DISTINCT,使用如下: select DISTINCT lsh from a inner join b on a.lsh=b.lsh试试看 <> ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================ > |
christie
資深會員 發表:30 回覆:299 積分:475 註冊:2005-03-25 發送簡訊給我 |
|
cwc65536
初階會員 發表:47 回覆:121 積分:48 註冊:2004-10-14 發送簡訊給我 |
christie 大大, 感謝回應, 可惜看不大懂.
您的意思, 好像是先把 B 利用 group 濃縮成不會重覆的子句,再被 join
嗯 ! 有道理,
select * from A left join (select * from B group b0) BB on (A.a0=BB.b0) , 可是會錯 讓我們用 deity 大大的範例好嗎 ?
例如, A表: a0 a1 a2 1 aa aaa 2 bb bbb B表: b0 b1 b2 1 zz zzz 3 yy yyy 1 xx xxx select a0,a1,b1 from A left outer join B on A.a0=B.b0 會得到 1 aa zz 1 aa xx 2 bb NULL 而我希望, 只有 1 aa zz 2 bb NULL 用 select DISTINCT a0,a1,b1 from A left outer join B on A.a0=B.b0 無效而且 select a.a1, b.b1 from a full outer join b on a.a0=b.b0 這個 full outer join 在 dbISAM 好像不支援 才疏學淺, 問題多, 請見諒 |
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
你好:
例如, A表: a0 a1 a2 1 aa aaa 2 bb bbb B表: b0 b1 b2 1 zz zzz 3 yy yyy 1 xx xxx 1 zz xxx 加多一条可看出DISTINCT的作用 select a0,a1,b1 from A left outer join B on A.a0=B.b0 會得到 1 aa zz 1 aa xx 1 aa zz 2 bb NULL 用 select DISTINCT a0,a1,b1 from A left outer join B on A.a0=B.b0 的话会得到: 1 aa zz 1 aa xx 2 bb NULL 但会觉得奇怪,为什么还是会出现两个1呢,其实两条记录并不相同,后面b1 字段值不同,所以它们并非两条完全相同的记录!它也就会显示出两个1的记录来。其实加DISTINC已经起到了作用。可从上面红色部看出 而我希望, 只有 1 aa zz 2 bb NULL 觉得从你的需求来看,有点怪怪的。那究竞是用1 aa zz还是1 aa xx,这两条记录可是不相同的哦。没理由就只需要1 aa zz这条吧,还是有其他判断的条件,比如说取最大值等等~~============================ 为什么经过多年以后,得失的过程如此冷漠 ============================ |
christie
資深會員 發表:30 回覆:299 積分:475 註冊:2005-03-25 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |