web-dev-qa-db-de.com

SQL Server - INNER JOIN WITH DISTINCT

Es fällt mir schwer, folgendes zu tun:

select a.FirstName, a.LastName, v.District
from AddTbl a order by Firstname
inner join (select distinct LastName from
            ValTbl v  where a.LastName = v.LastName)  

Ich möchte ValTbl beitreten, aber nur für bestimmte Werte. 

16
Nate Pet

Versuche dies:

select distinct a.FirstName, a.LastName, v.District
from AddTbl a 
  inner join ValTbl v
  on a.LastName = v.LastName
order by a.FirstName;

Oder das (es tut dasselbe, aber die Syntax ist anders):

select distinct a.FirstName, a.LastName, v.District
from AddTbl a, ValTbl v
where a.LastName = v.LastName
order by a.FirstName;
12
kol

Nate , ich denke, Sie haben tatsächlich einen guten Start für die richtige Antwort in Ihrer Frage (Sie brauchen nur die richtige Syntax). Ich hatte genau das gleiche Problem, und das Einfügen von DISTINCT in eine Unterabfrage war in der Tat weniger kostspielig als die anderen Antworten, die hier vorgeschlagen wurden. 

select a.FirstName, a.LastName, v.District
from AddTbl a 
inner join (select distinct LastName, District 
    from ValTbl) v
   on a.LastName = v.LastName
order by Firstname   
4

Es ist nicht dasselbe, wenn Sie zu Beginn eine Auswahl treffen, da Sie alle berechneten Zeilen aus dem Ergebnis verschwenden.

select a.FirstName, a.LastName, v.District
from AddTbl a order by Firstname
natural join (select distinct LastName from
            ValTbl v  where a.LastName = v.LastName)

versuch das.

2
AlfredoVR

fügen Sie "unterscheidend" nach "Auswahl" hinzu.

select distinct a.FirstName, a.LastName, v.District , v.LastName
from AddTbl a 
inner join ValTbl v  where a.LastName = v.LastName  order by Firstname
1

Sie können CTE verwenden, um die unterschiedlichen Werte der zweiten Tabelle abzurufen und diese dann mit der ersten Tabelle zu verknüpfen. Sie müssen auch die unterschiedlichen Werte basierend auf der LastName-Spalte abrufen. Sie tun dies mit einer Row Last (), die durch den Nachnamen partitioniert und nach dem Vornamen sortiert wird.

Hier ist der Code

;WITH SecondTableWithDistinctLastName AS
(
        SELECT  *
        FROM    (
                    SELECT  *,
                            ROW_NUMBER() OVER (PARTITION BY LastName ORDER BY FirstName) AS [Rank]
                    FROM    AddTbl
                )   
        AS      tableWithRank
        WHERE   tableWithRank.[Rank] = 1
) 
SELECT          a.FirstName, a.LastName, S.District
FROM            SecondTableWithDistinctLastName AS S
INNER JOIN      AddTbl AS a
    ON          a.LastName = S.LastName
ORDER   BY      a.FirstName
1

wählen Sie aus AddTbl a .__ einen eindeutigen a.FirstName, a.LastName, v.District Inner Join ValTbl v in a.LastName = v.LastName Reihenfolge nach a.FirstName;

hoffe das hilft

0