2014-10-31 44 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