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

如何調出有明細沒主檔的記錄

答題得分者是:kadee
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-06-09 22:41:53 IP:61.67.xxx.xxx 未訂閱
請問各位

如何用一段sql調出有明細沒有主檔的記錄資料來

環境:firebird 2.x XP

query1 主檔:headno, bodyno
query2 明細:headno, bodyno 為關聯

目前發生部份主檔記錄不見, 但明細記錄還在, 雖用手動方式查詢可以查的到, 但資料量龐大, 是否有 sql 可以查出?

謝謝!
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-06-09 23:11:37 IP:60.250.xxx.xxx 訂閱
利用主Table Right Join 明細Table
條件為主 Table 之 headno 是否為null
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
kadee
高階會員


發表:11
回覆:141
積分:165
註冊:2002-03-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-06-10 14:40:08 IP:59.127.xxx.xxx 訂閱
query1 主檔:headno, bodyno 
query2 明細:headno, bodyno 為關聯

select q2.*
from query2
where not exists
(select 1 from query1 q1
where q1.headno = q2.headno
and q1.bodyno = q2.bodyno)
------
Kadee/BigRed Ent.
www.tw165.com
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-06-10 17:15:14 IP:61.67.xxx.xxx 未訂閱
感謝提供, 測試結果確認無誤
我目前另外先是用程式來解決這段
cobraliu
中階會員


發表:15
回覆:75
積分:83
註冊:2007-11-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-06-10 17:19:22 IP:122.117.xxx.xxx 訂閱
select * from query2 where (headno,bodyno) not in (select headno,bodyno from query1)

select * from query2 where not exists (select headno, bodyno from query1)-->不知Firebird能不能用這個用法...

===================引 用 P.D. 文 章===================
請問各位

如何用一段sql調出有明細沒有主檔的記錄資料來

環境:firebird 2.x XP

query1 主檔:headno, bodyno
query2 明細:headno, bodyno 為關聯

目前發生部份主檔記錄不見, 但明細記錄還在, 雖用手動方式查詢可以查的到, 但資料量龐大, 是否有 sql 可以查出?

謝謝!
------
初學、初學、學了很久...還是在初學階段..Orz
kadee
高階會員


發表:11
回覆:141
積分:165
註冊:2002-03-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-06-11 09:07:39 IP:59.127.xxx.xxx 訂閱
select * from query2 where (headno,bodyno) not in (select headno,bodyno from query1)
不建議用 not in的方式,因為firebird 看到 in 會使用table scan 而不會使用index去處理,
一旦table筆數很多的話,處理的時間會很漫長,當然筆數不多還是可以用。
但是firebirdd的正確語法應該是:(假設 headno 和 bodyno 都是 varchar)

select * from query2 where query2.headno||'&'||query2.bodyno not in (select query1.headno||'&'||query1.bodyno from query1)



select * from query2 where not exists (select headno, bodyno from query1)-->不知Firebird能不能用這個用法...

應該不會是你要得結果,如果 query1有任何一筆 record 的話,
Where後面的條件都會是 false,應該不會取回任何一筆紀錄。
反之則會取會query2的所有紀錄。
------
Kadee/BigRed Ent.
www.tw165.com
系統時間:2024-04-23 15:59:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!