2013-12-16 23 views
0

我不清楚下面的問題,並且好奇地知道它們之間有什麼不同,儘管它們都檢索到相同的結果。 (數據庫使用的是sports2000)。找到第一和第一個不同進展4GL

爲每一個客戶WHERE狀態= 「NH」,
客戶的第一道命令:
DISPLAY Customer.Cust-NAME民訂單貨號訂單日期。
END。

FOR EACH Customer WHERE State =「NH」:
查找第一個客戶無錯誤的訂單。
如果有效訂單THEN
DISPLAY Customer.Cust-Num NAME Order-Num Order-Date。 END。

請給我解釋一下

問候 菅

回答

0

你的第一條語句是連接語句,這意味着更少的網絡流量。而且您只會收到客戶和訂單記錄都存在的記錄,因此不需要做進一步的檢查。 (更有效率)

第二條語句將檢索每個客戶,然後爲每個客戶發現它將按訂單進行查找。因爲可能沒有訂單,所以您還需要執行額外的陳述(如果可用)。這是檢索記錄的一種效率較低的方式,並且會導致更多不需要的網絡流量和更多的語句執行。

2

由於AquaAlex說你的第一個片段是一個連接(語法的「,」部分使它成爲連接)並且有他提到的所有優點和缺點。然而,還有一個重要的附加「con」 - 與FIRST和FOR ...進行連接,永遠不要使用。

FOR LAST - Query, giving wrong result

它最終會咬你的屁股。

找到FIRST沒有太大的好處。

這兩個陳述的根本問題是它們意味着有一個命令,您希望的記錄是FIRST實例。但是聲明的任何部分都沒有說明這個順序。因此,如果有多條記錄滿足查詢條件,則不知道您實際獲得哪條記錄。如果你這樣做的唯一原因是爲了查看是否有一個或多個記錄,而且你沒有實際使用記錄緩衝區的意圖,那可能就沒有問題。但如果是這種情況,那麼CAN-FIND()將是一個更好的語句。

有一個神話,認爲第一個據說更快。如果你相信這一點,或者認識某人,我勸你試一試。這不是真的。確實,在FIND返回大量記錄的情況下,添加FIRST會更快 - 但這不是蘋果。隨機抓取蘋果後扔掉蒲式耳。如果你的代碼是這樣的,你的蘋果現在具有魔法屬性,這將導致無法治癒蟲子。

OF也是有問題的。 OF意味着基於編譯器猜測的WHERE子句可以使用兩個表中具有相同名稱並且是唯一索引一部分的字段來連接表。這似乎是合理的,也許是這樣,但它掩蓋了代碼並使維護程序員的工作更加困難。它是一個很好的演示,但不應該在現實生活中使用。

+0

+1好擴展答案絕對同意不使用第一 – AquaAlex

相關問題