2013-05-30 38 views
1

我們正試圖修改我們系統中的一個進程,我無法想出一個能夠檢索正確數據的查詢。系統當前使用作者信息表中的titlekey從術語表中檢索數據,這意味着所有作者都有相同的術語。我們希望能夠爲作者添加特定的條款,但仍然允許其他作者使用與標題相關的術語。我不確定SQL將根據作者行檢索適當的術語行。Visual FoxPro查詢

我的想法是在術語表中添加作者專欄。對於作者信息表中的第2行,我們希望從術語表中檢索第2行。但是對於作者表中的第1行和第3行,我們希望從術語表中檢索第1行。這將是一個參數化的視圖。是否有可能讓一個查詢執行檢索?如果可以,你可以提供一個`FoxPro SQL`樣本?

例子:

的作者信息表:


Key AuthorKey TitleKey 
    --- --------- -------- 
    1   1   1 
    2   2   1 
    3   3   1 

表術語:


Key AuthorKey TitleKey Term 
    --- --------- -------- ---- 
    1   0   1  .50 
    2   2   0  .60 

鑑於Author鍵2和標題碼1,在作者信息錶行2,我們希望從術語表中返回.60的術語。

我道歉,如果我不清楚,所以這裏是一個使用上面的模擬表的例子。

如果我將titlekey view參數設置爲1,將authorkey viewparamter設置爲2,我想要檢索2的term key .60。

如果我將titlekey視圖參數設置爲1,將authorkey viewparamter設置爲3,我希望.50,term key爲1,以便檢索。

+0

這將有助於如果您展示您期望的輸出類型的示例... – Sparky

+1

您可以編輯您的問題標題以便更具描述性,因爲問題主體不會提及FoxPro一次!另外,您是否可以根據您已提供的表格內容提供所需輸出的示例? –

回答

0

這可能不是有效的「FoxPro SQL」,但我相信它會回答你的問題。

SELECT 
    Term.Term 
FROM Term 
    INNER JOIN Author ON Author.Key = Term.Key 
     AND Author.AuthorKey = @AuthorKey 
     AND Author.TitleKey = @TitleKey 

設置@AuthorKey = 2@TitleKey = 1會產生.60在你的榜樣。

這裏假定Author.Key和Term.Key是各自表中的唯一列,並且Author.AuthorKey, Author.TitleKey的組合也是Author表的唯一鍵。

1

你的問題很不清楚,我想我有你在找什麼。讓我試着重申帖子......如果我不正確,請糾正我。

你有一個作者列表...在最低限度,他們有一個「標題」鍵,所有作者得到一個詞的速率,無論具體的加入...但是,在某些條件下,我們有一個術語應取代默認的「術語」,但前提是存在作者的密鑰ID匹配的相應術語記錄。如果存在基於作者的密鑰,則需要該實例的速率而不是默認值。

這就是說,我開始與作者表的查詢。我正在使用不同的別名對TERMS表進行兩次連接,並加入相應的Author和Title鍵。 NVL()我會爲「By Author」別名查找FIRST,並獲得它的期限值。如果沒有「按作者」值,則通過「按標題」別名實例獲得後退值,該實例適用於所有作者,如您最初指出的那樣。

我已經抓取了額外的列,以便您可以看到數據的相關性並確認它是否符合您的預期。

select; 
     a.Key,; 
     a.AuthorKey,; 
     a.TitleKey,; 
     ByAuthor.Term as TermByAuthor,; 
     ByTitle.Term as TermByTitle,; 
     NVL(ByAuthor.Term, ByTitle.Term) as ChosenTerm; 
    FROM ; 
     author a ; 
     LEFT JOIN terms as ByAuthor ; 
      ON a.authorKey = ByAuthor.AuthorKey; 
     LEFT JOIN terms as ByTitle ; 
      ON a.TitleKey = ByTitle.TitleKey 

如果你正在尋找一個特定的作者,只是把

WHERE a.AuthorKey = whateverValue

+0

我相信會做到這一點。謝謝 –

+0

@KenDenault,如果正如我描述的那樣,它應該,我創建了遊標並測試了查詢:) – DRapp

+0

@KenDenault,如果這確實起作用,一定要upvote並打勾選,以便其他用戶在這裏試圖提供幫助don'不要看待仍在等待解決方案的問題......它還可以幫助其他人瞭解DID爲您工作的其他人,以便他們可以嘗試實施。 – DRapp

0

你的數據庫似乎錯誤地歸一化。重複鍵不起作用。

假設您的數據是用於發佈系統的某種工資單(即,每個AUTHOR都有一個TITLE,並且以設置的TERM付款),那麼您的表結構將更容易和更簡單,如下所示。 (請注意,你必須編輯這個它實際上在FoxPro中運行。)

CREATE TABLE author ( 
    authorID I AUTOINC PRIMARY KEY, 
    titleID I, 
    termID I 
) 

CREATE TABLE title (
    titleID I AUTOINC PRIMARY KEY, 
    termID I 
) 

CREATE TABLE term (
    termID I AUTOINC PRIMARY KEY, 
    rate N(3,2) 
) 

然後,您可以選擇使用查詢的作者,他們的頭銜,他們的有效稅率如下,使用subquery到爲每位作者選擇有效的termID

SELECT sq.authorID, sq.titleID, R.rate 
FROM (
    SELECT A.authorID, T.titleID, NVL(A.termID, T.termID) AS termID 
    FROM author AS A 
    INNER JOIN title as T ON A.titleID = T.titleID 
) as sq 
LEFT OUTER JOIN term as R 
    on sq.termID = R.termID 

您可能還需要而不是定義term只是一個直的數值,除非這裏有沒有注意到其他列。如果術語僅僅是「作者每字支付多少便士」,則它可以直接在TITLE或AUTHOR上直接打印N(3,2)或甚至Y