線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1432
推到 Plurk!
推到 Facebook!

JOIN 語法的問題

缺席
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-27 19:02:29 IP:203.203.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-27 22:56:11 IP:211.74.xxx.xxx 未訂閱
看到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  3
Right就是反過來 Full就是left right
A    B
Null   1
2      null
3      3
星期一,星期二...星期日..星期一..無窮迴圈@@
------
星期一,二...無窮迴圈@@
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-28 00:50:17 IP:203.203.xxx.xxx 未訂閱
pgdennis您好: 當 table 如下 A B 1 1 2 1 3 3 left join 的結果變四筆記錄 ( 因為 B 有兩筆 1 ) 1 1 2 3 怎樣下命令, 才能只 query 出三筆 1 2 3 感謝您抽空回應
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-28 09:44:46 IP:218.15.xxx.xxx 未訂閱
插个花:对于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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-28 15:25:45 IP:203.73.xxx.xxx 未訂閱
select * from tblA a
    left join(select ino, sum(amt) from tblB group by ino) b 
        on a.ino=b.ino    
Do your best!
------
What do we live for if not to make life less difficult for each other?
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-31 00:01:02 IP:203.203.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-01 08:39:37 IP:218.15.xxx.xxx 未訂閱
你好:
  例如,
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-02 12:50:51 IP:203.73.xxx.xxx 未訂閱
Hi cwc65536: 或許請你將Table(and contain), POST上來 比較方便討論.
------
What do we live for if not to make life less difficult for each other?
系統時間:2024-06-02 18:54:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!