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

SQL語法的篩選

缺席
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-12-01 12:17:03 IP:118.160.xxx.xxx 未訂閱
請問各位

現有一個我思考很久想不出的語法, 還請各位給予賜教

有一個資料庫檔, 內有兩支table, 分別是 TableA, TableB

TableA 欄位有 no1, name
TableB 欄位有 no1, no2, counts

示範的資料表內容為

TableA
no1 name
001 小王
002 小明
003 小張

TableB
no1 no2 count
001 A 5
001 B 8
001 C 10
002 A 3
002 B 3
002 C 7
003 A 10
003 B 2
003 C 4

我想取出 TableB 中 凡是 A>=5, B<=3 屬於 TalbeA 的記錄
在TalbeB中符合 A>=5 的只有 no1 的 001 及 003
符合 B<=3的有 002 及 003 兩組
取其交集, 應該取出的是 TableA 中的 003 記錄
我嘗試很多寫法都做不到, 例如
select * from TableA a, TableB b
where a.NO1=b.NO1 and
(
(b.NO2='A' and b.COUNTS>=5) and
(b.NO2='B' and b.COUNTS<=3)
)
結果是空記錄, 這個語法取到空是當然的, 因為不可能一筆RECORD='A' 又='B'
但如果我把 and 改 or, 取出來的是3筆, 分別是 001, 002, 003
(b.NO2='A' and b.COUNTS>=5) or
(b.NO2='B' and b.COUNTS<=3)

所以想請教各位前輩, 不知道有沒有可能用一段SQL就能達成這個結果
謝謝!
編輯記錄
P.D. 重新編輯於 2016-12-01 12:17:48, 註解 無‧
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-12-01 12:45:25 IP:118.160.xxx.xxx 未訂閱
剛剛我又特別去查了一些SQL語法的書, 有一本提到這樣的寫法, 實測資料好像可以, 還要再驗證

select * from TableA a, TableB b, TableB c
where
(a.NO1=b.NO1 and b.NO2='A' and b.COUNTS>=5) and
(a.NO1=c.NO1 and c.NO2='B' and c.COUNTS<=3)
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2016-12-01 15:58:40 IP:118.160.xxx.xxx 未訂閱
已核對過資料, 上面的寫法確實可行, 謝謝各位啦!
sryang
尊榮會員


發表:38
回覆:742
積分:876
註冊:2002-06-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2016-12-01 16:29:20 IP:59.127.xxx.xxx 未訂閱
建議改成 SQL-92 標準的 join table 寫法
select * from TableA a
inner join TableB b on a.NO1=b.NO1
inner join TableB c on a.NO1=c.NO1
where
(b.NO2='A' and b.COUNTS>=5) and
(c.NO2='B' and c.COUNTS<=3)
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
Ray_Lin
一般會員


發表:0
回覆:30
積分:11
註冊:2015-07-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2016-12-01 18:29:40 IP:220.135.xxx.xxx 未訂閱
我比較喜歡用IN的作法,比較直覺
SELECT * FROM TABLEA A WHERE A.NO1 IN
(SELECT B.NO1 FROM TABLEB B WHERE (B.NO2='A' AND B.COUNTS>=5) OR (B.NO2='B' AND B.COUNTS<=3)
不知這樣是否可以達到作者的需求
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2016-12-01 20:52:28 IP:118.160.xxx.xxx 未訂閱
不知道使用 join 與 in 的優缺點在那裡? 我很少使用這兩種, 可否討教一二?

將二段語法分別下去測試我的真實記錄
TableA 有 41000筆記錄, TableB 有220000筆記錄

Sryang兄的語法挑出二筆, 與我的語法速度幾乎一樣, 答案一致
Ray_Lin兄的語法, 可能當中下 or 不對, 找出了72筆, 但如果改為 and 則空記錄

不過我要的功能, 除要要篩選外, 還是拉出 a, b, c 的欄位
我的
select a.NO1, a.xxxx, a.xxxx, b.COUNTS as COUNTb, c.COUNTS as COUNTc
from D2001 a, D2002 b, D2002 c
where
(a.NO1=b.NO1 and b.NO2='A' and b.COUNTS >=5) and
(a.NO1=b.NO1 and b.NO2='B' and b.COUNTS <=3)

Sryung 的
select a.NO1, a.xxxx, a.xxxx, b.COUNTS as COUNTb , c.COUNTS as COUNTc from D2001 a
inner join D2002 b on a.NO1=b.NO1
inner join D2002 c on a.NO1=c.NO1
where
(b.NO2='A' and b.COUNTS >=5) and
(c.NO2='B' and b.COUNTS <=3)

如果 Ray_lin 的語法前面下這樣則會報錯
select a.NO1, a.xxxx, a.xxxx, b.COUNTS as COUNTb , c.COUNTS as COUNTc from
....
編輯記錄
P.D. 重新編輯於 2016-12-01 21:20:22, 註解 無‧
P.D. 重新編輯於 2016-12-01 21:21:19, 註解 無‧
Ray_Lin
一般會員


發表:0
回覆:30
積分:11
註冊:2015-07-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2016-12-07 09:37:57 IP:220.135.xxx.xxx 未訂閱
如果要取得其他欄位應該如下
SELECT A.NO1,A.NAME,C.NO1 AS BNO,C,NO2,C.COUNT FROM TABLEA A LEFT JOIN TABLEB C ON C.NO1=A.NO1 WHERE A.NO IN
(SELECT B.NO1 FROM TABLEB B WHERE (B.NO2='A' AND B.COUNTS>=5) OR (B.NO2='B' AND B.COUNTS<=3)
我不確定是否有誤會PD的意思,不過可以從我組的SQL結果的明細看對不對
it1506
初階會員


發表:30
回覆:83
積分:47
註冊:2011-02-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2017-09-14 14:30:19 IP:59.120.xxx.xxx 未訂閱

===================引 用 P.D. 文 章===================

select * from TableA a, TableB b
where a.NO1=b.NO1 and
(
(b.NO2='A' and b.COUNTS>=5) and
(b.NO2='B' and b.COUNTS<=3)
)
===================引 用 P.D. 文 章===================e
這裡的條件要改一下吧 , b.no2 in ('A','B') and b.counts between 3 and 5
編輯記錄
it1506 重新編輯於 2017-09-14 14:31:11, 註解 無‧
系統時間:2017-11-19 22:13:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!