2017-02-06 148 views
1

我有一張表,其中包含商店和屬性的列表,它們以周爲單位指示商店的年齡和商店的訂單量。第二張表格列出了基於年齡和數量的UPLH目標。我想退回第一張表中列出的商店以及相關的UPLH目標。以下正常工作:計算字段給函數錯誤提供無效參數的子查詢

 SELECT store, weeksOpen, totalItems, 
    (
    SELECT max(UPLH) 
    FROM uplhGoals as b 
    WHERE b.weeks <= a.weeksOpen AND 17000 between b.vMIn and b.vmax 
    ) as UPLHGoal 
    FROM weekSpecificUPLH as 

a 

但此查詢,這是從第一臺現場更換TOTALITEMS的硬編碼值,給我的「無效參數的功能」的錯誤。

SELECT store, weeksOpen, totalItems, 
(
SELECT max(UPLH) 
FROM uplhGoals as b 
WHERE b.weeks <= a.weeksOpen AND a.totalItems between b.vMIn and b.vmax 
) as UPLHGoal 
FROM weekSpecificUPLH as a 

任何想法,爲什麼這不工作?還有其他選擇嗎?我可以很容易地使用dmax()並遍歷每條記錄來創建一個新表,但這似乎是查詢應該能夠產生的東西的漫長過程。

SQLFiddle:http://sqlfiddle.com/#!9/e123a8/1 看來,SQLFiddle輸出(下)是我所尋找的,即使Access給出的錯誤。

| store | weeksOpen | totalItems | UPLHGoal | 
|-------|-----------|------------|----------| 
|  1 |  15 |  13000 |  30 | 
|  2 |  37 |  4000 |  20 | 
|  3 |  60 |  10000 |  30 | 

編輯:

weekSpecificUPLH是查詢不是表。如果我在Access中創建一個新的測試表,並使用相同的字段,它將起作用。這會告訴我,它與[totalItems]字段實際上是計算結果有關。所以相反,我用[a.IPO * a.OPW]替換該字段。同樣的錯誤。它好像不把它當作正確的數字類型。

我用盡:

SELECT store, weeksOpen, (opw * ipo) as totalItems, 
(
SELECT max(UPLH) 
FROM uplhGoals as b 
WHERE 17000 between b.vMIn and b.vmax AND b.weeks <= a.weeksOpen 
) as UPLHGoal 
FROM weekSpecificUPLH as 
a 

其中工程。但用'totalitems'和相同的錯誤替換'17000'。我什至嘗試使用val(totalItems)無濟於事。

+0

不拉UPLHGoal查詢錯誤消息說哪個函數獲取無效參數? – Barmar

+0

我看到的唯一函數是'MAX()',並且在兩個版本中都有相同的參數。 – Barmar

+0

您可以使用示例數據來展示問題的sqlfiddle嗎? – Barmar

回答

0

東西正在改變totalItems的價值類型。爲了解決我:

  • 複製weekSpecificUPLH查詢結果到一個新表「tempUPLH」
  • 使用的表來代替它正確地從「uplhGoals」表
0

嘗試把它變成

b.vmin < a.totalItems AND b.vmax > a.totalItems 

雖然是問題,你的數據庫設計。 對於未來的方法,如果您顯示數據庫結構將非常有幫助。

例如,你似乎沒有記錄在weekSpecificUPLH表中關於UPLHGoals表中的記錄,你呢?

或者更一般的說法:除了Goals表中的數據本身描述的規則(這是DB模型的「外部」)之外,這些表格不以任何方式相關。因此,當你稱之爲「關聯」時,你會讓其他人陷入混淆之中,我認爲,因爲每個人都立即開始考慮關係模型方面的經典關係。

+0

您的錯誤,他們在數據庫方面沒有關聯,因此誤會。我嘗試了導致相同錯誤的方法。如果要用靜態值(例如13200)替換a.totalItems,它將返回類似於我的第一個示例的正確結果。 – TRyanHodges

+0

但是你的初始代碼也適用於SQLFiddle - 試試吧。 它是合法的。 PS雖然連接的查詢也是syntactiacally合法的 - 它在概念上是非常錯誤的:這些表之間沒有任何連接,因爲它們不相關。 記住SQL是聲明式的,因此引擎完全定義瞭如何解釋你聲明的內容並將其轉化爲特定的動作 - 我會選擇更簡單的查詢,並且首先完成一個「閉包」 雖然,無論如何 - 執行計劃是什麼應該在這裏決定 –

+0

這種解決方案,在Access中,返回與原始相同的錯誤。 – TRyanHodges

相關問題