程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 一個復合查詢方法

一個復合查詢方法

編輯:關於MYSQL數據庫
幾乎每個完整的應用程序都會需要一個復合查詢。建立一個功能強大的復合查詢首先必須要能夠動態生成查詢條件,其次應該能夠對查詢到的數據進行修改,最後這個復合查詢最好能夠對一對多的兩個表建立條件進行查詢。

在VFP裡建立查詢的方法主要有這麼幾種:一是使用VFP中自帶的SearchClass類;二是建立一個查詢;三是建立一個視圖,其中包括參數化視圖、宏替換Sql語句視圖;四是建立一個Grid,將其數據源設置為SQL語句或臨時表。

不管哪一種方法,其實質都是使用SQL語句。

這幾種方法各有各的優點,也都有缺點。

建立查詢的方法最死板,只能建立固定條件的查詢,並且不能更新數據,最不能滿足要求。

SearchClass類功能強大,但是它只能對一個表建立條件進行查詢,並且它的源代碼太復雜了,幾乎難以進行修改定制;(初學者想必都有過用表單向導建立表單後試圖修改txtbtn類、SearchClass類的經歷吧!看到源代碼後有幾個沒昏倒?)用將Grid的數據源設置為SQL語句或臨時表的方法無法修改/更新數據,刷新數據也比較困難。(這方面的問題在網易虛擬社區VFP版上有過許多討論,大家可以去看看。)建立視圖的方法中,參數化視圖也太簡單。不管是用表單控件的值作參數還是用給參數兩端加上引號的方法都只能對固定的字段進行查詢。如果是復合查詢,難道要先建立幾十個視圖嗎?最有前途的辦法還是用宏替換SQL語句建立視圖的辦法。視圖有著能夠對數據進行修改/更新的優點,如果能夠動態生成查詢條件,那麼就是最完美的查詢了。

建立宏替換sql語句視圖的具體辦法是先動態生成一個Sql語句sqlstatement,然後用宏替換的方法使用Create Sql view vIEwname as &sqlstatement來動態建立視圖,最後將數據動態顯示在一個Grid控件中。

看到這裡,VFP大蝦們怕會大喊:Stop!你當我是菜鳥啊!你的辦法從理論上雖然行的通,但實際做起來就會碰到查詢結果在表格上數據無法刷新的難題。俺早就試過不行了!你想騙稿費啊!

嘿嘿,這個難題偏偏給我解決了!這就是我洋洋得意的寫這篇文章的原因!

問題的解決

==========

幾個月前(好可憐^0^.....),我參照VFP的Sample中的Solution裡的Interactively Bulid a sqlstatement示例建立了一個復合查詢,想將它集成到我自己的程序中。由於該示例是用browse窗口來顯示查詢結果的,而我自己的應用程序使用了頂層表單,結果編譯後運行才發現Browse窗口在頂層表單中無法顯示。於是我建立了一個有兩個表單的表單集,用一個表單makesql動態生成sql語句,在另一個表單form1上用grid來顯示查詢結果的數據,在給Grid設置數據源的時候,問題來了。首先使用臨時表來作為表格的數據源,結果第一次查詢正確,更改條件進行第二次查詢時碰到了眾所周知的"不能更新臨時表"的錯誤;使用sql語句倒是可以,可是在表格顯示數據前會莫名其妙的先出現一個Browse窗口,必須關閉它後才會顯示表格,由於browse窗口在使用頂層表單的程序中無法顯示,結果導致程序無法繼續執行,這個辦法也不行。

最後只能使用Create sql view viewname as &sqlstatement的辦法了,先隨便建立一個視圖tempview,把表格的Recordsourcetype屬性設置為1-別名,Recordsource屬性設置為視圖別名tempview,在表單makesql上建立sql語句後的代碼中使用create sql view temp view as &sqlstatement建立視圖TempvIEw.
執行後發現,第一次查詢正確,更改查詢條件後再次查詢,出現"視圖已存在,要改寫嗎?"的情況,按下"確定"後,出現的表格中沒有數據。

避免出現對話框的問題好解決,在建立視圖前先用rename view tempview to oldview,然後用Delete view oldvIEw將舊的視圖刪除就可以了。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved