Eric Hill( 艾瑞克·希爾 ),SAS JMP 首席系統開發人員
注意:這只是論文的文本;不包括螢幕截圖。請參閱論文的附件版本以了解全文。

查詢產生器
JMP 12 的新工具可將您的 SQL 資料匯入 JMP
(針對 JMP 12.1 進行了更新)
作者:Eric Hill,JMP 軟體開發人員
內容
- 介紹. 2
第一部分:建立聯繫. 3
第 2 部分:選擇查詢的表. 6
第 3 部分:建置查詢. 11
新增列. 十三
儲存查詢. 15
執行查詢. 15
回答問題. 16
- 濾. 19
提示過濾器. 23
- 取樣. 二十五
編寫自己的 SQL. 二十六
第 4 部分:管理背景查詢. 二十七
查詢狀態面板 二十八
運行查詢視窗..二十八
第 5 部分:共享查詢. 二十八
第 6 節:從 JMP 腳本語言 (JSL) 執行查詢. 二十九
JMP 12.1 有哪些新功能?. 31
- 搜尋. 31
新增相關表. 三十二
作為模板打開. 三十四
編輯計算列公式. 三十四
問題修復. 三十五
- 結論. 三十五
介紹
JMP 為您提供了大量的分析工具,但如果您無法以您需要的方式將您需要分析的資料匯入 JMP,那麼這些工具對您來說就沒有任何用處。 JMP 已經支援透過檔案 > 資料庫 > 開啟表格將關聯式資料庫中的資料匯入 JMP 一段時間了。 開啟表格就目前情況而言還不錯,但它確實有一些明顯的限制:
- 關係資料庫中的大多數數據都以規範化的方式存儲,需要連接才能獲取所需的所有數據,但開啟表格無法幫助您進行連接;您必須自己編寫 SQL。
- 雖然開啟表格提供了用於建立 WHERE 子句的公式編輯器,但它不會顯示分類變數的不同值以幫助您對其進行過濾。
- 安全地與他人分享您的查詢可能很困難,因為開啟表格將您的密碼儲存在它產生的 JSL 腳本的連接字串中。
- 開啟表格不會幫助您完成匯入資料後所需的後處理步驟,例如資料清理、建模類型和格式。
查詢產生器從一開始就被設計用來解決開啟表格的局限性,幫助您建立具有提示互動過濾功能的多表查詢,並且可以與同事安全地共享。
在本文中,我將使用查詢產生器和一個可免費使用的PostgreSQL範例資料庫戴爾商店2 。 PostgreSQL是一個開源資料庫,可以從這裡免費下載:
http://www.postgresql.org/download/
The 戴爾商店2 sample database can be found here:
http://wiki.postgresql.org/wiki/Sample_Databases
戴爾商店2範例資料庫也可用於其他資料庫平台(MySQL、Oracle 和 SQL Server)。
第一部分:建立聯繫
Initiate 查詢產生器 using File > Database > Query Builder from the menu:
您也可以從JMP 入門第一頁啟動它:
最後,在 Windows 上,您也可以在主視窗工具列上找到一個查詢產生器工具:
After launching 查詢產生器, you will be greeted with 選擇資料庫連接 dialog box:
The 選擇資料庫連接 dialog box is a subset of the 開啟表格 window. 查詢產生器 and 開啟表格 use the same ODBC connections and in fact share connections, so any connections you make in either place will show up in both.
按一下「新連線...」以使用現有 DSN 連線到資料庫或建立新的 DSN。系統將提示您提供任何所需的憑證:
連接後,JMP 將從連接中檢索模式,以幫助您確保這是您想要的連接:
您也可以看到所選模式中可用的表。按一下“Next”繼續下一步。
JMP 12.2 的新功能: 請注意模式 - 表格面板中的兩個搜尋框。這些是 JMP 12.1 更新中的新功能,它們可以在模式和表格清單中輸入時過濾。我們知道你們中的許多人都有數百種模式,並且在給定模式中擁有數百個表,因此新的搜尋框可以幫助您縮小列表範圍,以便您找到所需內容。
第 2 部分:選擇查詢的表
圖 1:選擇查詢的表
當您按一下下一個時,將出現「選擇表」對話方塊。在「選擇表」對話方塊中,您將選擇要包含在查詢中的表(請參閱上圖 1 )。在可用表清單中選擇想要包含在查詢中的表,然後將其新增至右上角的主表和次表清單中。
- 查詢中的主表通常是應從中檢索所有行的表,無論它們是否在其他表中具有匹配的值。用資料倉儲術語來說,這就是您的事實表。一個查詢中只能有一個主表。
- 二級表通常是查找表。預設情況下,僅當主表中的列值與輔助表中指定列的值相符時,輔助表中的行才會包含在查詢中。用資料倉儲術語來說,這些就是您的維度表。您可以根據需要向查詢新增任意數量的輔助表。
右下方的面板顯示有關所選表的資訊。 列選項卡顯示表中每一列的信息,包括它是否是某種鍵:
JMP 12.2 的新功能:請注意可用表面板中的搜尋框,這是 JMP 12.1 中的新功能。當您的模式包含很多表時,請使用它來找到您正在尋找的表。
表格快照面板顯示資料的快照,以便您可以確保表中包含所需的資訊:
通常,在建立查詢時,您心中會有一個或多個希望得到解答的問題,這些問題會決定查詢需要包含哪些表。我們正在探索的數據來自一家虛構的 DVD 租賃公司。我想要回答的問題是:
- 哪些類型的電影收入最高?
- 哪些演員的收入最高?
租賃表記錄了該公司存續期間的每一次 DVD 租賃事件,因此該表將成為此查詢的主要表。我可以從列面板中看到,租賃具有與庫存和客戶表具有外鍵關係的欄位:
圖 2:外鍵
外鍵關係(也稱為外鍵約束)意味著需要在一個表的列中的值在另一個表的主鍵列中找到。從圖2我們可以看出, 租賃表的inventory_id列的值必須存在於存貨表的主鍵列中, 租賃表的客戶 ID列的值必須存在於客戶表的主鍵列中,rentals表的員工編號列的值只存在於職員表的主鍵列中。對於此查詢,我正在尋找有關租賃電影的更多信息,而不是參與租賃的工作人員的客戶,因此我將存貨表作為輔助表添加到查詢中。
查看存貨表的列面板,我可以進一步看到與影片表的外鍵關係:
圖 3:庫存表詳細信息
因此電影表也進入查詢。查看電影表的詳細信息,我看到一個rental_rate列,這應該是我計算收入所需要的,但我沒有看到有關電影類別或電影演員的任何信息:
圖 4:影片表中的列
然而,查看可用表列表,我看到一個電影演員表和一個影片類別表,它們似乎將電影的 ID 映射到其演員和類別,以及包含更多有關演員和類別信息的演員和類別表。所以我也希望在查詢中使用這些表。但是,如果我簡單地添加這 4 個表,似乎會出現問題:
圖 5:自動加入失敗
中間帶有“X”的“停止標誌”圖示表示 JMP 無法自動連接這兩個表,因此我必須手動設定連接。如果您發現 JMP 的自動連線功能經常無法滿足您的需要,您可以透過「選擇要查詢的表格」旁邊的紅色三角形來關閉。
如果我選擇公共.電影演員 (t14)並點擊編輯連接按鈕(),則會彈出編輯條件對話框,允許我設定連線。最初,對話框如下所示:
圖 6:編輯連線條件
因為還不存在連線條件。我想將film_actor.film_id加入庫存.film_id 。為了實現這一點,我只需從左列清單中選擇存貨表,然後在兩個清單中選擇影片編號 :
圖 7:編輯連線條件
類似地,我可以將public.film_category的連線條件設定為inventory.film_id = 影片類別.film_id 。這樣做之後,事情看起來好多了:
圖 8:表之間的連接有效
所有輔助表都顯示左外連接維恩圖圖示。以我們剛剛在電影演員和存貨之間建立的連接為例,左外連接意味著存貨表(在本例中為左表)中的所有行都將包含在查詢中,無論電影演職員表中是否有匹配項,但僅包含film_actor表中與inventory表中的某一行匹配的行。
順便說一下,表名後括號中的t1 、 t2 、 t3等是 JMP 在將表加到查詢時分配給表的表別名。表別名使得產生正確的SQL更加容易,並且使得產生的SQL更具可讀性。您可以透過右鍵單擊表格清單中的表格並選擇“變更別名”來變更表格的表格別名。表別名不能包含空格或特殊字元。
如果您需要左外連線以外的其他內容,您可以使用編輯加入對話方塊中的核取方塊變更連線類型。連線類型和維恩圖圖示將會改變以反映複選框的狀態。
圖 9:更改連線類型
若要檢查是否正確設定了連接,您可以按一下「預覽連接」按鈕。這將運行查詢並顯示前幾百行資料的快照,以便您檢查一切是否正確。
現在我們已經有了查詢中需要的所有表,我們可以單擊“構建查詢”來調出查詢器本身,我們可以在其中指定查詢中要包含哪些列、要使用的過濾條件、如何對結果資料進行排序等等。
第 3 部分:建置查詢
當查詢產生器視窗首次針對此查詢出現時,它看起來如下所示:
- 查詢名稱方塊包含查詢的名稱,預設為主表的名稱。查詢名稱是指派給執行查詢後產生的 JMP 資料表的名稱,也是將查詢儲存到檔案時的預設檔案名稱。資料來源顯示查詢正在使用的資料來源的名稱。
- 表格框顯示目前查詢中的表。若要新增或刪除表格或變更連接,請按一下變更...按鈕。
- 可用列清單顯示查詢中所有資料表的所有列。從此清單中選擇列並將其拖曳到「包含的列」 、 “過濾器”或「排序依據」面板。或者,如果您願意,也可以透過右鍵單擊來完成相同的操作。
JMP 12.1 中的新功能:可用列面板現在有一個搜尋框,以便您在長列表中找到特定列。與其他搜尋框一樣,它會在您輸入時進行過濾。 - 包含的列面板顯示查詢包含的所有列的網格。使用包含的列網格來設定列資料匯入 JMP 後應具有的格式和建模類型等內容。如果您希望在資料進入 JMP 之前對其進行匯總,您也可以為列指定聚合以及分組依據。
對於支援採樣的資料庫,此面板中還有一個「範例」選項卡,用於在伺服器上產生隨機資料樣本。 - 此區域中的「查詢預覽」標籤會自動更新,以顯示執行查詢時將傳回的資料快照。 SQL選項卡顯示查詢產生器根據目前選擇產生的 SQL。後查詢腳本標籤可讓您指定在查詢完成後執行的 JSL 腳本。查詢狀態標籤顯示在背景執行的查詢的狀態並允許您取消它們。
- 篩選器面板可讓您指定過濾資料的條件(建立 WHERE 子句)並將篩選器轉換為每次執行查詢時執行的提示。
- 排序依據面板可讓您指定用於對傳回的行進行排序的列(ORDER BY 子句)。
新增列
每個查詢都需要一些列。使用下列任一方法為查詢新增列:
- 按一下「全部新增」按鈕以新增查詢中所有資料表的所有可用列
- 從可用列清單中選擇特定列,然後按一下「新增」或將其拖曳過來。
- Double-click on a column in the可用列list.
對於此查詢,我將從電影表中新增影片編號、 標題和rental_rate ,從類型表中新增 category_id和姓名 ,從演員表中新增演員 ID 、 名和姓 。
圖 10:最初新增列之後
使用包含的列的JMP 名稱、建模類型和格式列,我可以控制資料匯入 JMP 後每列的名稱、建模類型和格式。
圖 11:調整列細節後
為了進行分析,我還希望將演員姓名連接在一列中,而不是分成單獨的名字和姓氏。為了實現這一點,我可以透過從可用列面板上的紅色三角形選單中選擇「新增計算列」來新增計算列。
這將向可用列列表添加一個名為計算1的列,但我可以右鍵單擊它並使用重命名列將其重命名為演員姓名 ,將其新增至查詢並刪除名稱和姓氏。執行此操作後,查詢的預覽如下:
圖 12:計算列的查詢預覽
(這些演員姓名值可能看起來有點奇怪,但實際上它們是來自資料庫的正確名稱。演員姓名似乎是透過隨機將名字與姓氏配對產生的。)
儲存查詢
此時,我已經在這個查詢上投入了足夠的時間,我想保存它,以免失去我的工作。只需點擊查詢產生器視窗右下角的「儲存」按鈕即可儲存查詢。系統將提示您提供檔案名,預設為查詢名稱方塊中的文字。我將查詢命名為影片類別_演員 。查詢產生器視窗左下方將顯示一則訊息,確認查詢已儲存:
Saving a query creates a file with a .jmp查詢 extension. Back on the 查詢產生器 window, you’ll notice that the 查詢名稱 has been changed to match the file name, so it is now 影片類別_演員.
如果您需要建立另一個與已開啟的查詢類似的查詢,但想要保留原始查詢,則可以使用另存為...按鈕以不同的名稱儲存副本。
執行查詢
此時我還可以執行查詢來建立包含資料庫中所有行的 JMP 資料表。點擊查詢產生器視窗底部的「執行查詢」按鈕來執行查詢。預設情況下,JMP 在背景執行查詢,以便您可以在查詢執行時繼續工作。使用視窗底部中央部分的「查詢狀態」標籤檢視此查詢產生器視窗中仍在處理的查詢的狀態,或使用「檢視」>「正在執行的查詢」檢視目前在背景執行的所有查詢的狀態。這個特定的查詢只需要一兩秒鐘,傳回 88,020 行:
圖13:JMP資料表查詢結果
請注意,產生的 JMP 資料表有 3 個腳本和一個定義的SQL表變數:
回答問題
此時,我幾乎能夠回答我最初尋求答案的問題了,但我必須做出一個決定:我是否要讓資料庫匯總結果,還是將原始資料帶入 JMP 並讓 JMP 完成工作?如果原始資料不是太大而無法放入記憶體並且導入時間不會太長,那麼將原始資料匯入 JMP 並進行分析有很多優點——JMP 比關聯式資料庫更有能力分析資料。
對於手頭上的任務,只需在類別名稱和演員名稱上使用分佈平台,使用租賃率作為頻率變數。如果我按計數升序對生成的直方圖進行排序,我會得到一個可以回答我們兩個問題的結果:
圖 14:使用分發平台查看查詢結果
但是,如果引入所有原始資料的大小或耗費的時間過長,我可以替代地使用包含的列面板中的聚合列來讓資料庫匯總資料。然而,為此,我需要一次回答這兩個問題。
To answer the question of 哪些類型的電影收入最高?, I can remove the columns having to do with actor information from the query and ask the database to sum 出租率 grouping by 類別名稱, and then I can order the result by the summed 出租率. Here are the steps:
- 點擊出租率的聚合列並選擇總計。
請注意,對於所有沒有指定聚合的變量,分組依據都會被檢查。一旦查詢中的任何欄位指定了聚合,則查詢中所有未指定聚合的資料列都需要被分成對應的資料列。 - Right-click on the 變數名稱 column for 出租率 and select 排序依據.
- 在排序依據面板中選擇SUM(t4.租金率) ,然後按一下向下箭頭按鈕(降序)。
結果如下:
Similarly, taking the category columns back out and putting the actor columns back in, I can answer the question of 哪些演員的收入最高?:
濾
讓我們回顧一下當時我們的查詢正在檢索所有原始資料並且我們正在使用分配平台來回答我們的收入問題的狀態。在 JMP 中進行分析時,我們有一個選項是可以請求 JMP 分析的腳本:
I can then paste that script into the 查詢後腳本 panel of 查詢產生器:
圖 15:新增後查詢 JSL 腳本
每次我執行查詢時,該腳本都會運行。
現在,我想稍微完善一下我的問題。我可能不想查看資料庫中所有租賃的類別和演員收入,而是想根據電影租賃的國家、租賃的商店或某個日期範圍來查看。
租賃表有租賃日期和客人 ID字段,所以我接近得到我需要的東西了。我們先前看到,客人 ID是顧客表的外鍵引用。從顧客表中,我們可以獲得顧客所在的國家以及租借 DVD 的商店。
如果我單擊查詢生成器的表格面板中的更改...按鈕,我可以返回並向查詢添加更多表。為了獲取國家信息,我需要在查詢中添加顧客、地址、城市和國家表。幸運的是,透過該資料庫的管理員設定的關鍵關係,所有表都自動連接成功。
新增必要的附加表後,返回查詢產生器,我可以將所需的列新增至查詢:租賃日期、 商店 ID和國家。我還設定了友善的 JMP 名稱並更正了商店 ID的建模類型:
圖 16:新增租賃日期、商店 ID 和國家/地區列後
首先,讓我們根據客戶的國家進行篩選。我可以在包含的列面板中右鍵單擊t7.國家變數並選擇“Filter By” 。執行此操作後,國家/地區過濾器會出現在篩選器面板中:
圖 17:國家/地區過濾器
此時,我可以簡單地向下滾動國家列表並檢查我感興趣的國家,然後執行查詢,並且只會包含來自這些國家/地區的行。
類似地,我可以添加商店 ID和租賃日期的過濾器,之後過濾器面板如下所示:
當我新增租賃日期過濾器時,由於它是一個連續變量,所以我預設得到一個簡單比較過濾器。我想要的是一個範圍過濾器。使用t1.租賃日期旁邊的紅色三角形選單,我可以將過濾器類型變更為範圍:
Now the filter for t1.租賃日期 looks like:
允許我指定一個日期範圍。因此,如果我想查找 2005 年下半年的所有租賃信息,我可以這樣做:
圖 18:日期範圍過濾器
查詢產生器中的所有篩選器類型都提供了有效停用它們的方法,因此您可以為查詢新增多個篩選器,即使對於給定的查詢,並非所有篩選器都處於活動狀態。對於顯示值清單的分類過濾器,選擇頂部的(全部)項目將停用過濾器。對於請求數字值的過濾器,將值設為缺失(.)會停用過濾器(或過濾器的一部分)。因此,如果我想要從 2006 年 1 月 1 日開始的所有租賃,我可以這樣做:
現在,我的查詢的選單面板如下圖 19所示。
| 圖 19:使用缺失值停用濾波器 | 圖 20:具有兩個 OR 組的過濾器 |
使用圖 19所示的過濾器選擇,現在執行查詢將返回客戶所在國家/地區為法國或德國,並且 DVD 於 2006 年 1 月 1 日或之後在商店 2 租借的行。預設情況下,多個篩選器以 AND 關係連接在一起,因此一行必須匹配所有篩選器才會出現在結果中。如果您需要「OR」過濾器,請按一下「OR」按鈕,這將建立另一個過濾器組,然後將兩個過濾器組透過「OR」連接在一起。例如,上圖 20中顯示的過濾器返回類別為戲劇或電影標題包含「Bucket」的租賃。
提示過濾器
儘管能夠在查詢生成器中指定過濾條件很不錯,但是您可能還想創建一個查詢供其他人使用,而這些其他人實際上並不需要看到整個查詢生成器用戶界面,但您希望他們每次運行查詢時都能夠輸入不同的過濾條件。實現此目的的最簡單方法是從選單旁邊的紅色三角形選單中選擇「執行時全部提示」 :
這會將查詢中的所有篩選器轉變為提示篩選器。如果您只希望某些過濾器有提示而其他過濾器沒有,則可以使用紅色三角形選單為每個單獨的過濾器開啟或關閉提示。
設定「運行時提示」後,當我執行此查詢時,系統會提示我按我想要的方式設定篩選器值:
提示的預設設定是查詢執行先前在查詢產生器中選擇的內容(如果查詢直接從檔案執行,則為在已儲存的查詢檔案中選擇的設定)。
您也可以自訂提示中使用的標籤。例如,假設我想要提示的是“客戶國家: ”,而不是“國家:”。返回查詢產生器,使用t7.國家過濾器的紅色三角形選單,選擇設定提示。這將開啟一個對話框,允許您更改提示的標籤以及更改提供提示類別層級的表:
取樣
如果您的資料庫支援隨機抽樣,則調查生產器上方中央部分的範例標籤將顯示您的資料庫支援的抽樣選項。我一直使用 PostgreSQL 作為本文中的範例,它支援對指定數量的行進行簡單隨機抽樣:
SQL Server 和 Oracle 支援不同的取樣選項,因此「取樣」標籤將反映不同的選項:
| 圖 21:SQL Server 取樣選項 | 圖 22:Oracle 採樣選項 |
在資料下載到 JMP 之前,資料庫會執行取樣,因此這是限制從查詢中檢索到的行數的好方法,否則查詢將檢索到過多的行。
編寫自己的 SQL
我們認識到,儘管查詢產生器現在具有或將來可能具有許多功能,但有時您可能需要執行查詢產生器不直接支援的操作。此外,您可能已經編寫並精心偵錯了一些 SQL,這些 SQL 可以執行您需要 JMP 執行的查詢。查詢產生器有兩個選項可以為查詢提供您自己的 SQL:
- 自訂篩選器運算式-如果查詢產生器在選擇資料表和指定要包含的資料列方面符合您的需要,但您只想將自訂 SQL 運算式作為篩選器的一部分,則可以從篩選器紅色三角形選單中選擇「新增自訂運算式」 :
| 圖 23:新增自訂過濾表達式 | 圖 24:產生的濾波器 |
在自訂表達式方塊中輸入您想要的任何 SQL,只要它是查詢的有效 SQL。
如果將自訂表達式篩選器設定為提示篩選器,則自訂運算式將出現在篩選器提示對話方塊中並可編輯。
- 將整個查詢轉換為自訂 SQL 查詢– 如果您只想為整個查詢編寫自己的 SQL,那麼在啟動查詢產生器並指定資料連接後,您可以使用查詢產生器左上角查詢名稱欄位旁邊的紅色三角形選單,然後選擇轉換為自訂 SQL :
圖 25:轉換為自訂 SQL
查詢產生器視窗將切換到自訂 SQL 模式,為您提供較大的區域來輸入您自己的 SQL。如果您已經開始以互動方式建立查詢,則自訂 SQL框將使用基於您迄今為止所做的選擇產生的 SQL 進行初始化(請參閱下面的圖 26 )。
圖 26:自訂 SQL 查詢
您可以根據需要編輯 SQL,或從其他來源貼上 SQL,然後按一下更新按鈕來更新查詢預報。一些注意事項:
- 您不能使用自訂 SQL 查詢進行提示篩選。
- 將查詢轉換為自訂 SQL 並編輯 SQL 後,如果將查詢還原為互動式查詢,您將遺失對 SQL 所做的所有自訂。查詢產生器不會嘗試解釋 SQL。
第 4 部分:管理背景查詢
查詢產生器預設在背景執行查詢,也可以從 JMP 腳本語言 (JSL) 在背景執行查詢(請參閱第 6 節)。 JMP 提供了兩種方法供您查看目前正在執行的後台查詢清單並在必要時停止正在執行的查詢。
查詢狀態面板
在查詢產生器的中下部分,有一個查詢狀態標籤。從該查詢產生器視窗啟動的任何後台查詢都會出現在該選項卡中:
如果您想停止正在執行的查詢,只需在清單中選擇它並點擊「停止」按鈕。如果已經檢索到一些行,JMP 將開啟一個包含已檢索到的所有行的資料表。數據表的名稱將反映出結果是部分的。
運行查詢視窗
從主視窗或其他包含選單的 JMP 視窗的「檢視」功能表中,選擇「執行查詢」 。這將開啟一個與查詢產生器的查詢狀態標籤相同的窗口,但「正在執行的查詢」視窗將包含目前在背景執行的所有查詢,無論它們是如何被呼叫的(查詢產生器視窗或 JMP 腳本語言):
再次選擇一個查詢並點擊停止以停止其運行,打開任何部分結果。
第 5 部分:共享查詢
在介紹中提到,開啟表格建立的腳本很難共享,因為資料庫密碼包含在連接字串中。查詢產量器的工作方式不同。如果您儲存一個查詢的 .jmp 查詢文件,並且該查詢的連接需要密碼,並且在文字編輯器中開啟該文件,您將看到如下內容:
您可以看到使用者名稱( 唯一識別 )存在於連接字串中,但隨後您看到密碼=%_PWD_% 。 「%_PWD_%」不是密碼;它是查詢產生器放置在那裡的佔位符。當查詢產生器看到該佔位符時,它就知道最初需要密碼,因此如果在開啟此查詢的使用者尚未連接到Postgres 資料庫 DSN 時開啟此查詢,查詢產生器就會知道提示使用者輸入密碼。
那麼 DSN 本身又如何呢?如果將此 .jmpquery 檔案傳送給 JMP 用戶,而該用戶的機器上沒有定義名為Postgres dvdrental的 DSN,會怎麼樣?在這種情況下,開啟表格無法繼續,但查詢生產器將通知用戶這種情況,並讓他們有機會連接到不同的 DSN(可能連接到同一個資料庫)或建立新的。
由於不同使用者的電腦上可能定義不同的 DSN,因此某些組織已轉向無 DSN 連線。查詢產生器目前無法將基於 DSN 的連接字串轉換為無 DSN 的連接字串,但如果您變更查詢腳本中的連接字串,使其指定司機和伺服器而不是指定直接連接網路 ,則查詢產生器將在其產生的任何腳本或 .jmpquery 檔案中傳播此無 DSN 連線。
第 6 節:從 JMP 腳本語言 (JSL) 執行查詢
查詢產生器建構的查詢也可以從JMP 腳本語言 (JSL)腳本執行。最好的選擇是將查詢儲存為.jmp 查詢文件,從 JSL 打開它並運行它。例如,假設您在c:\使用者\公用\temp資料夾中儲存了一個名為pg_rentals.jmpquery的查詢。以下是您可以使用 JSL 中的查詢檔案執行的一些操作:
打開( “c:\users\public\temp\pg_rentals.jmpquery” );
詢問= 打開( “c:\users\public\temp\pg_rentals.jmpquery”,私人的);
- Open the query in 查詢產生器 for editing:
詢問<< 調整;
詢問<< 跑步();
- 在前台執行查詢。查詢完成後,產生的資料表將在 JMP 中開啟。 dtResult 將是對結果資料表的參考。
dt結果=詢問<< 運作前台();
- 在前台執行查詢,但不在JMP 中開啟產生的資料表;保持私密。 dtResult 將是對結果資料表的參考。
dt結果=詢問<< 運作前台(私人的);
- 在背景執行查詢。查詢完成後,產生的資料表將在 JMP 中開啟。執行後台無法傳回對結果資料表的引用,因為查詢只是在背景啟動。下面的範例展示如何在背景執行查詢時取得對結果資料表的參考。
詢問<< 運行背景();
- 在背景執行查詢。如果查詢成功,則在結果資料表上呼叫分發平台( 查詢結果是運行完成腳本中引用結果資料表的特殊 JSL 變數)。如果查詢被使用者取消或出現錯誤,則向 JMP 日誌寫入一則訊息。
詢問<< 運行背景(
運行完成時(
查詢結果<< 分配( 名義分佈( 柱子( :標題) ) );
),
運行取消(寫( “\!N查詢取消!” ) ),
出現錯誤時(寫( “\!NError 運行查詢!” ); )
);
- 在背景執行查詢。查詢成功完成後,呼叫 MyFunc 函數。查詢結果資料表總是作為第一個參數傳遞給該函數。
::函數= 功能({日期},{預設本地},
寫( “\!n租賃次數:”, 行數(日期) );
日期<< 分配( 名義分佈( 柱子( :標題) ) );
);
詢問<< 運行背景(運行完成時(::MyFunc ) );
如果從 JSL 腳本中單獨的 .jmpquery 檔案開啟查詢不令人滿意,您可以從查詢產生器視窗左上角的紅色三角形選單中取得用於建立查詢腳本物件的原始腳本:
例如,呼叫「儲存運行腳本到腳本視窗」進行簡單查詢會得到以下結果:
新的 SQL 查詢傳回一個 SQL 查詢腳本對象,就像開啟.jmpquery 檔案時所做的那樣,並且可以以相同的方式使用。
JMP 12.1 有哪些新功能?
搜尋
我們交談過的許多人的資料庫中都有數百種模式、表格和列,其中包含大量資料。在JMP 12.1版本的查詢產生器中,我們在模式、表格和列的清單中新增了搜尋框,以協助您快速找到所需內容:
所有這些搜尋框都會在您鍵入時更新,並且您可以選擇使用正規表示式來優化搜尋。
新增相關表
在選擇要查詢的表格對話方塊中,如果新增至查詢中的資料表具有對其他資料表的外鍵引用,則可以透過按一下新增相關資料表按鈕將所有這些相關資料表新增至查詢。
作為模板打開
通常,您需要建立一個與您已建置並儲存至 .jmpquery 檔案的另一個查詢非常相似的查詢。您隨時可以開啟先前儲存的查詢,對其進行更改,然後使用「另存為」將其儲存到不同的 .jmpquery 文件,但如果您不小心誤按了「節省」 ,您的原始查詢將被覆蓋。 「作為模板開啟」功能就是為了防止這種情況發生。在 Mac 和 Windows 上,可以從 .jmpquery 檔案的主視窗上下文功能表中找到「作為範本開啟」 :
當您開啟 .jmpquery 作為範本時,您實際上是開啟與磁碟上的 .jmpquery 檔案沒有關聯的原始查詢的副本。如果您已開啟查詢作為模板,則進行了變更並意外點擊了「節省」按鈕,系統將提示您提供一個檔案來儲存該查詢。
您也可以從 JMP 腳本語言 (JSL) 開啟 .jmpquery 檔案作為範本:
打開( “C:\Users\Public\Temp\rentals.jmpquery”,作為模板);
編輯計算列公式
在 JMP 12.0 中,您可以在查詢中新增一個計算列,該計算列將在資料庫伺服器上進行計算,並在查詢中傳回結果值。但是,如果您需要編輯先前建立的計算列的公式,則無法做到這一點。相反,您必須刪除計算列並新增一個新的列,這可能需要您重新建立一個複雜的公式。在 JMP 12.1 中,您現在可以選擇編輯計算列。只需右鍵單擊“可用列”中的列並選擇“編輯公式” :
問題修復
正如您所期望的,我們修復了 JMP 12.1 查詢產生器中的許多錯誤,其中一些是客戶報告的。如果您在使用查詢產生器時遇到問題,請透過 SAS 技術支援報告該問題,以便我們解決。
結論
查詢產生器是 JMP 12(在 JMP 12.1 中更新)中的新功能,可協助您針對關聯式資料庫建立高度客製化的多表 SQL 查詢。目標是讓您比以前更快地將資料以可供分析的形式輸入 JMP,並更輕鬆、更安全地分享您的查詢。我們希望您嘗試並向我們發送反饋(eric.hill@jmp.com) 什麼對你有用,什麼對你沒用。