2013-02-14 63 views
-1

我有一个查询:如何在表中加入第一个结果?

SELECT 

    Segment_ID = Segment_ID.Segment_ID, 
    Sprav_093.Name as Road_Wear 

FROM dbo.Road 
LEFT JOIN Segment_ID ON Road.Road_ID = Segment_ID.Road_ID 
LEFT JOIN Driveway_Pavement ON Segment_ID.Segment_ID = Driveway_Pavement.Segment_ID 
LEFT JOIN Sprav_093 ON Driveway_Pavement.Kod_Spr093 = Sprav_093.Kod_Spr 

是正常工作。表Driveway_Pavement中有几行Segment_ID。所以我想要得到这一行的第一个。我该怎么做?

+2

添加'LIMIT 1'到最后? [SQL限制/顶部](http://stackoverflow.com/questions/971964/limit-10-20-in-sqlserver) – UnholyRanger 2013-02-14 18:25:12

+0

是什么使这些行中的一个比另一个先行,是什么标准? – Lamak 2013-02-14 18:25:31

+3

SQL-Server使用'TOP 1',SQL Server不支持'LIMIT' – 2013-02-14 18:25:44

回答

5

假设你想返回一行每个段ID,这样做

;WITh CTE AS (
SELECT 

    Segment_ID = Segment_ID.Segment_ID, 
    Sprav_093.Name as Road_Wear, 
    CASE WHEN Sprav_093.Name IS NOT NULL THEN 
    ROW_NUMBER() OVER (PARTITION BY Segment_ID.Segment_ID 
         ORDER BY Sprav_093.Name//or date column) 
    ELSE 1 END rn 

FROM dbo.Road 
LEFT JOIN Segment_ID ON Road.Road_ID = Segment_ID.Road_ID 
LEFT JOIN Driveway_Pavement ON Segment_ID.Segment_ID = Driveway_Pavement.Segment_ID 
LEFT JOIN Sprav_093 ON Driveway_Pavement.Kod_Spr093 = Sprav_093.Kod_Spr 
) 
SELECT * FROM CTE WHERE RN = 1 
+0

是的它的工作,但我失去了一些行在'Segment_ID'中有207行,但是查询返回147. – 2013-02-14 18:34:41

+0

@KliverMax,检查更新的解决方案 – 2013-02-14 18:41:06

0

尝试应用MAX函数都选定字段

+1

Max可能在这里不工作,如果例如行是1,20和2,10对两行应用最大值给你2,20。这意味着你现在有两个不同的行的一部分 – 2013-02-14 19:47:31

0

这应该工作:

SELECT 

    Segment_ID = Segment_ID.Segment_ID, 
    Sprav_093.Name as Road_Wear 

FROM dbo.Road 
OUTER APPLY (
    SELECT TOP 1 Segment_ID.Segment_ID 
    FROM Segment_ID 
    WHERE Segment_ID.Road_ID = Road.Road_ID 
) Segment_ID 
LEFT JOIN Driveway_Pavement ON Segment_ID.Segment_ID = Driveway_Pavement.Segment_ID 
LEFT JOIN Sprav_093 ON Driveway_Pavement.Kod_Spr093 = Sprav_093.Kod_Spr 

如果您需要特定的“第一个”行,您可以将ORDER BY添加到OUTER APPLY内部的SELECT