2015-03-31 37 views
0

我有一個表(SoilSheet):查找列列訪問

ID | FieldID | SAMP_NUM | LINE_NUM | Year 

的LINE_NUM列是1和25之間,我需要找到具有LINE_NUM行返回不同的SAMP_NUM和FieldID行的值他們在一排。

在SQL Server中,我能做到這一點(縮短到只返回第5個LINE_NUM列和它的作品幾乎瞬間:

SELECT DISTINCT S1.L1, S2.L2, S3.L3, S4.L4, S5.L5, 
    S.FieldID, S.SAMP_NUM FROM SoilSheet S 
LEFT OUTER JOIN 
    (SELECT SAMP_NUM, FieldID, LINE_NUM AS L1 
    FROM SoilSheet WHERE YEAR = 2013 AND LINE_NUM = 1) S1 
    ON S1.SAMP_NUM = S.SAMP_NUM AND S1.FieldID = S.FieldID 
LEFT OUTER JOIN 
    (SELECT SAMP_NUM, FieldID, LINE_NUM AS L2 
    FROM SoilSheet WHERE YEAR = 2013 AND LINE_NUM = 2) S2 
    ON S2.SAMP_NUM = S.SAMP_NUM AND S2.FieldID = S.FieldID 
LEFT OUTER JOIN 
    (SELECT SAMP_NUM, FieldID, LINE_NUM AS L3 
    FROM SoilSheet WHERE YEAR = 2013 AND LINE_NUM = 3) S3 
    ON S3.SAMP_NUM = S.SAMP_NUM AND S3.FieldID = S.FieldID 
LEFT OUTER JOIN 
    (SELECT SAMP_NUM, FieldID, LINE_NUM AS L4 
    FROM SoilSheet WHERE YEAR = 2013 AND LINE_NUM = 4) S4 
    ON S4.SAMP_NUM = S.SAMP_NUM AND S4.FieldID = S.FieldID 
LEFT OUTER JOIN 
    (SELECT SAMP_NUM, FieldID, LINE_NUM AS L5 
FROM SoilSheet WHERE YEAR = 2013 AND LINE_NUM = 5) S5 
    ON S5.SAMP_NUM = S.SAMP_NUM AND S5.FieldID = S.FieldID 
LEFT OUTER JOIN 
    (SELECT SAMP_NUM, FieldID, LINE_NUM AS L10 
FROM SoilSheet WHERE YEAR = 2013 AND LINE_NUM = 10) S10 
    ON S10.SAMP_NUM = S.SAMP_NUM AND S10.FieldID = S.FieldID 
WHERE Year = 2013 AND 
    (SELECT ID FROM Fields WHERE ID=S.FieldID) IS NOT NULL 
    ORDER BY S.SAMP_NUM, S.FieldID 

,我得到這個

L1 | L2 | L3 | L4 | L5 | FieldID | SAMP_NUM 
1 | NULL | NULL | NULL | NULL | 289508 | 4416 
1 | NULL | NULL | NULL | NULL | 291501 | 4417 
NULL | NULL | 3 | NULL | NULL | 291339 | 4418 
NULL | 2 | NULL | NULL | NULL | 291390 | 4418 
1 | NULL | NULL | NULL | NULL | 291535 | 4418 
1 | 2 | 3 | NULL | NULL | 287808 | 4470 
NULL | NULL | NULL | 4 | 5 | 287811 | 4470 

然而,轉換時到MS Access,這需要永遠。我也嘗試了下面這是在SQL Server很慢:

SELECT DISTINCT 
(SELECT LINE_NUM FROM SoilSheet WHERE LINE_NUM = 1 AND Year = 2013 
AND FieldID = S.FieldID AND SAMP_NUM = S.SAMP_NUM) AS L1, 
(SELECT LINE_NUM FROM SoilSheet WHERE LINE_NUM = 2 AND Year = 2013 
AND FieldID = S.FieldID AND SAMP_NUM = S.SAMP_NUM) AS L2, 
(SELECT LINE_NUM FROM SoilSheet WHERE LINE_NUM = 3 AND Year = 2013 
AND FieldID = S.FieldID AND SAMP_NUM = S.SAMP_NUM) AS L3, 
(SELECT LINE_NUM FROM SoilSheet WHERE LINE_NUM = 4 AND Year = 2013 
AND FieldID = S.FieldID AND SAMP_NUM = S.SAMP_NUM) AS L4, 
(SELECT LINE_NUM FROM SoilSheet WHERE LINE_NUM = 5 AND Year = 2013 
AND FieldID = S.FieldID AND SAMP_NUM = S.SAMP_NUM) AS L5, 
FieldID, SAMP_NUM FROM SoilSheet S 
WHERE Year = 2013 AND (SELECT ID FROM Fields WHERE ID = S.FieldID) 
IS NOT NULL ORDER BY S.SAMP_NUM, S.FieldID 

,但也需要永遠在Access中。有沒有辦法在Access中執行此操作?

+0

好吧,沒關係,我找到了一種方法來做到這一點: – 2015-03-31 00:57:23

+0

你應該看看轉動命令在SQL Server自25外連接是不最有效的路線。我有一段時間沒有使用過Access,但我相信TRANSFORM是相當的。 – ElPresidente 2015-03-31 01:05:21

+0

你可以回答你自己的問題,讓其他人知道 – sqluser 2015-03-31 02:22:43

回答

0

我找到了一種方法來做到這一點:

TRANSFORM LINE_NUM AS L 
SELECT SAMP_NUM, FieldID FROM SoilSheet WHERE Year = 2013 
GROUP BY SAMP_NUM, FieldID 
PIVOT LINE_NUM