2011-12-19 43 views
13

Tôi gặp một thời gian khó khăn làm như sau:SQL Server - INNER JOIN VỚI DISTINCT

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) 

tôi muốn làm một tham gia vào ValTbl nhưng chỉ cho giá trị khác biệt.

Trả lời

10

Hãy thử điều này:

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

Hoặc này (nó không giống nhau, nhưng cú pháp là khác nhau):

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

thêm "riêng biệt" sau "chọn".

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 
2

Đó là không giống nhau làm một lựa chọn khác biệt ngay từ đầu bởi vì bạn đang lãng phí tất cả các hàng được tính toán từ kết quả.

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) 

hãy thử điều đó.

+3

'NATURAL JOIN' là' sai cú pháp' trong MSSQL 2008 R1 – itsho

0

Bạn có thể sử dụng CTE để nhận các giá trị khác biệt của bảng thứ hai và sau đó kết hợp với bảng đầu tiên. Bạn cũng cần nhận các giá trị khác biệt dựa trên cột LastName. Bạn làm điều này với một Row_Number() được phân vùng bởi LastName, và được sắp xếp theo FirstName.

Dưới đây là đoạn 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

Nate, tôi nghĩ rằng bạn thực sự cung cấp một khởi đầu tốt cho câu trả lời đúng ngay trong câu hỏi của bạn (bạn chỉ cần cú pháp chính xác). Tôi đã có vấn đề này chính xác, và đặt DISTINCT trong một truy vấn phụ thực sự ít tốn kém hơn so với những câu trả lời khác ở đây đã đề xuất.

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 
Các vấn đề liên quan