2016-03-30 6 views
0

Ich habe den folgenden Code aus einer Datenbank auswählen, aber ich möchte nur den ersten Datensatz für jede eindeutige ID. Gibt es eine Möglichkeit, die SQL zu ändern, um dies zu erreichen?Wie kann ich diese SQL-Anweisung ändern, um nur die erste von jeder ID auszuwählen?

SELECT  
     [CARL_Property].ID 
     ,[PrDoorNum] 
     ,[PrAddress1] 
     ,[PrAddress2] 
     ,[PrAddress3] 
     ,[PrAddress4] 
     ,[PrPostcode] 
     ,[PrRent] 
     ,[PrAgreedRent] 
     ,[PrCommence] 
     ,[PrEnd] 
     ,[PrAvailable] 
     ,[PrGrossIncome] 
     ,[PrCouncilTax] 
     ,[PrInventoryFee] 
     ,[PrLetFee] 
     ,[PrReletFee] 
     ,[PrDateWithdrawn] 
     ,[Rent Review] 
     ,CARL_Owners.OwForenames 
     ,CARL_Owners.OwSurname 
     ,CARL_Property_List.[ID] 
     ,CARL_Property_List.[PrId] 
     ,CARL_Property_List.[PLBedrooms] 
     ,CARL_Property_List.[PlRooms] 
     ,CARL_Property_List.[PlBathrooms] 
     ,CARL_Property_List.[PlReceptions] 
     ,CARL_Property_List.[PlDeposit] 
     ,CARL_Tenant_Contacts.[Tenant Name] 
     ,CARL_New_Tenants.[TnLeaseperiod] 
     ,CARL_Property_List.[PlAdvertising] 
     ,[CARL_Property_Memos].[PrNotes] 
     ,[CARL_Safety].[PrGasInsp] 
     from dbo.CARL_Property Join dbo.[CARL_Property_Memos] on CARL_Property.ID=CARL_Property_Memos.PrID Join dbo.CARL_Owners on CARL_Owners.ID=CARL_Property.OwID Join dbo.CARL_PROPERTY_LIST ON dbo.CARL_PROPERTY.ID=dbo.CARL_PROPERTY_LIST.PrId Join dbo.[CARL_New_Tenants] ON CARL_New_Tenants.PrId=CARL_Property.ID JOIN CARL_Tenant_Contacts ON CARL_New_Tenants.ID = CARL_Tenant_Contacts.TnID Join [dbo].[CARL_Safety] On dbo.CARL_Property.ID=dbo.CARL_Safety.PrID 

Das Ergebnis ist wie folgt.

enter image description here

+1

Von Ihrem Screenshot scheint es mir, dass es eine Art von Vielfalt innerhalb Ihrer Tabelle Joins gibt. Ich würde empfehlen, die Abfrage oder die FK-Definitionen weiter zu vertiefen. Andernfalls könnten Sie einfach eine SELECT DISTINCT oder GROUP BY die Spalten verwenden, die Sie "eindeutig" sein möchten – alessalessio

+0

Dies ist super einfach mit ROW_NUMBER. Sie müssen nur definieren, was "zuerst" bedeutet. Definitionsgemäß ist eine Tabelle eine ungeordnete Menge. –

Antwort

0

Etwas in dieser Ich denke Linien ist das, was Sie suchen. Beachten Sie auch, dass ich Aliase in Ihrer Hauptabfrage verwendet habe. Es macht es viel einfacher zu arbeiten und reduziert die Menge an Eingabe durch eine Menge.

with SortedResults as 
(
    SELECT  
     cp.ID 
     , ROW_NUMBER() over(partition by cp.ID order by pl.ID) as RowNum --order by whatever column defines "first" 
     , [PrDoorNum] 
     , [PrAddress1] 
     , [PrAddress2] 
     , [PrAddress3] 
     , [PrAddress4] 
     , [PrPostcode] 
     , [PrRent] 
     , [PrAgreedRent] 
     , [PrCommence] 
     , [PrEnd] 
     , [PrAvailable] 
     , [PrGrossIncome] 
     , [PrCouncilTax] 
     , [PrInventoryFee] 
     , [PrLetFee] 
     , [PrReletFee] 
     , [PrDateWithdrawn] 
     , [Rent Review] 
     , o.OwForenames 
     , o.OwSurname 
     , pl.[ID] as PL_ID 
     , pl.[PrId] 
     , pl.[PLBedrooms] 
     , pl.[PlRooms] 
     , pl.[PlBathrooms] 
     , pl.[PlReceptions] 
     , pl.[PlDeposit] 
     , tc.[Tenant Name] 
     , nt.[TnLeaseperiod] 
     , pl.[PlAdvertising] 
     , pm.[PrNotes] 
     , cs.[PrGasInsp] 
    from dbo.CARL_Property p 
    Join dbo.[CARL_Property_Memos] pm on p.ID = pm.PrID 
    Join dbo.CARL_Owners o on o.ID = p.OwID 
    Join dbo.CARL_PROPERTY_LIST pl ON p.ID = pl.PrId 
    Join dbo.[CARL_New_Tenants] nt ON nt.PrId = p.ID 
    JOIN CARL_Tenant_Contacts tc ON nt.ID = tc.TnID 
    Join [dbo].[CARL_Safety] cs On p.ID = cs.PrID 
) 

select * 
from SortedResults 
where RowNum = 1 
order by ID 
+0

Perfekt, mit ein paar Änderungen habe ich es geschafft, dass es funktioniert, du bist ein Star. –