2014-10-31 43 views
1

我有以下表:如何在子 - 子查詢引用表

Bradford_Score_Bands

BandNo InclusiveScore 
------------------------ 
1   0 
2   150 
3   500 

Bradford_Scores

ClockNo  Dated  Score 
-------------------------------- 
2   30/10/14  123 
99   30/10/14  3 
2   29/10/14  101 
99   29/10/14  8 

僱員

ClockNo 
-------------------- 
2 
3 
99 

我的目標是根據自己的分數來制定出BandNo每個ClockNo今天和昨天

我能找到根據分值這樣正確的BandNo:

SELECT MIN(BandNo) FROM Bradford_Score_Bands WHERE InclusiveScore >= 123 

我可以找到得分今天和昨天對每個人是這樣的:

SELECT DISTINCT EMP.ClockNo, 
ISNULL((SELECT Score FROM Bradford_Scores BFT WHERE Dated = '2014-10-30' AND BFT.ClockNo = EMP.ClockNo), 0) As ScoreToday, 
ISNULL((SELECT Score FROM Bradford_Scores BFT WHERE Dated = '2014-10-29' AND BFT.ClockNo = EMP.ClockNo), 0) As ScoreYesterday 
FROM Employees EMP 

但我不能似乎能夠將兩者結合起來。我覺得像這樣的工作:

SELECT DISTINCT EMP.ClockNo, 
(SELECT MIN(BandNo) FROM Bradford_Score_Bands WHERE InclusiveScore >= 
(SELECT Score FROM Bradford_Scores BFT1 WHERE Dated = '2014-10-30' AND BFT1.ClockNo = EMP.ClockNo)), 
(SELECT MIN(BandNo) FROM Bradford_Score_Bands WHERE InclusiveScore >= 
(SELECT Score FROM Bradford_Scores BFT2 WHERE Dated = '2014-10-29' AND BFT2.ClockNo = EMP.ClockNo)) 
FROM Employees EMP 

但在我引用BFTX.ClockNo = EMP.ClockNo子查詢中的部分似乎是導致查詢失敗。我得到的幫助的普遍錯誤「數據記錄ManagerCurrency不是在記錄」

編輯: 我試圖在SQL Server此完全相同的查詢和它的作品,所以是有辦法重新寫這使它更普遍友好?

回答

1

現在這被標記爲SQL Server我不覺得需要編寫一個普適的查詢工作。

我把你的原始查詢並以一種更簡單的方式重寫它。也許試試看看它是否能解決你的問題?

DECLARE @Bradford_Score_Bands TABLE (BandNo INT, InclusiveScore INT); 
INSERT INTO @Bradford_Score_Bands VALUES (1, 0); 
INSERT INTO @Bradford_Score_Bands VALUES (2, 150); 
INSERT INTO @Bradford_Score_Bands VALUES (3, 500); 
DECLARE @Bradford_Scores TABLE (ClockNo INT, Dated DATE, Score INT); 
INSERT INTO @Bradford_Scores VALUES (2, '20141030', 123); 
INSERT INTO @Bradford_Scores VALUES (99, '20141030', 3); 
INSERT INTO @Bradford_Scores VALUES (2, '20141029', 101); 
INSERT INTO @Bradford_Scores VALUES (99, '20141029', 8); 
DECLARE @Employees TABLE (ClockNo INT); 
INSERT INTO @Employees VALUES (2); 
INSERT INTO @Employees VALUES (3); 
INSERT INTO @Employees VALUES (99); 

--Original Query 
SELECT DISTINCT 
    EMP.ClockNo, 
    (SELECT MIN(BandNo) FROM @Bradford_Score_Bands WHERE InclusiveScore >= (SELECT Score FROM @Bradford_Scores BFT1 WHERE Dated = '2014-10-30' AND BFT1.ClockNo = EMP.ClockNo)), 
    (SELECT MIN(BandNo) FROM @Bradford_Score_Bands WHERE InclusiveScore >= (SELECT Score FROM @Bradford_Scores BFT2 WHERE Dated = '2014-10-29' AND BFT2.ClockNo = EMP.ClockNo)) 
FROM 
    @Employees EMP; 

--New query 
SELECT 
    e.ClockNo, 
    MIN(bsbt.BandNo), 
    MIN(bsby.BandNo) 
FROM 
    @Employees e 
    LEFT JOIN @Bradford_Scores bst ON bst.ClockNo = e.ClockNo AND bst.Dated = '20141030' 
    LEFT JOIN @Bradford_Scores bsy ON bsy.ClockNo = e.ClockNo AND bsy.Dated = '20141029' 
    LEFT JOIN @Bradford_Score_Bands bsbt ON bsbt.InclusiveScore >= bst.Score 
    LEFT JOIN @Bradford_Score_Bands bsby ON bsby.InclusiveScore >= bsy.Score 
GROUP BY 
    e.ClockNo; 

當在SQL Server上運行這兩個查詢時,我得到了完全相同的結果。

+0

謝謝 - 這似乎在Pervasive和SQL Server上都有技巧。 – 2014-10-31 16:20:34