2017-07-14 26 views
-2

我有三個關係表,結構樣本如下。DISTINCT值來自SQL中的RIGHT JOIN

properties: 

property_id | property_name | county_id 
------------|---------------|------- 
    1  | Davis Court | 2 
    2  | Rose Lodge | 1 
    3  | Haven Court | 4 
    4  | Great Lodge | 1 
    5  | Lilly Court | 2 
    6  | Miles Lodge | 4 
    7  | Priory Court | 5 


testimonials: 

testimonlal_id | property_id | message 
---------------|-------------|------------------ 
     1  | 4  | blah blah blah 
     2  | 2  | blah blah blah 
     3  | 6  | blah blah blah 
     4  | 3  | blah blah blah 
     5  | 1  | blah blah blah 
     6  | 7  | blah blah blah 
     7  | 5  | blah blah blah 

counties: 

county_id | county_name 
----------|---------------- 
    1  | Berkshire 
    2  | Devon 
    3  | Essex 
    4  | Kent 
    5  | Surrey 

我想爲表格中的所有感言顯示不同的縣名。我目前有以下查詢。

SELECT DISTINCT properties.county_id, counties.county_id, 
counties.county_name, testimonials.testimonial_id 
FROM properties 
LEFT JOIN counties 
    ON properties.county_id = counties.county_id 
RIGHT JOIN testimonials 
    ON properties.property_id = testimonials.property_id 
ORDER BY properties.county_id ASC 

目前這讓我

Berkshire 
Berkshire 
Devon 
Devon 
Kent 
Kent 
Surrey 

但我想

Berkshire 
Devon 
Kent 
Surrey 

這可能需要的BY運營商使用UNION或GROUP的,但我不知道該如何去適應查詢。

在此先感謝

+4

你是選擇4列,只想要一個?刪除不需要的列 – JohnHC

+1

有多個'testimonial_id',當然你會得到重複的縣名 –

+2

我不明白那些外部連接(好吧,右外連接是難以閱讀,並與q的左外連接混合可怕的。)你想達到什麼目的?有沒有財產證明?沒有縣可以有房產嗎?你也許也在尋找沒有財產的縣?和/或沒有推薦的屬性? –

回答

0

爲什麼你選擇testimonials.testimonial_id時,它就是你要選擇你的下拉框縣目前還不清楚。簡單地從選擇列表中刪除它會導致縣沒有重複。

您可以通過不加入(因此不必關閉與DISTINCT的行)來獲得更清晰的結果。當它是您想要選擇的縣時,請從counties中選擇。如果您有選擇哪個縣的標準,則將此標準置於WHERE條款中。

select county_name, county_id 
from counties 
where county_id in 
(
    select county_id 
    from properties 
    where property_id in (select property_id from testimonials) 
); 
+0

感謝這個@ThorstonKettner,但沒有真正理解我使用這個工作的語法。我從來沒有使用過IN運算符,所以需要加快速度。再次感謝。 –

+0

不客氣。是的,閱讀「IN」是個好主意。這很容易理解。你應該爲'EXISTS'做同樣的事情,我們用它來進行更復雜的查找。 –

0

如果你想所有推薦,然後與該表開始,用left join

SELECT c.county_id, c.county_name, t.testimonial_id 
FROM testimonials t LEFT JOIN 
    properties p 
    ON p.property_id = t.property_id LEFT JOIN 
    counties c 
    ON p.county_id = c.county_id 
ORDER BY p.county_id ASC; 

注:

  • SELECT DISTINCT應該是不必要的,除非你在重複基礎表。如果是這樣,請將其重新插入。
  • 表別名使查詢更易於編寫和讀取。
  • 使用外部連接時,我建議只粘貼到LEFT JOIN s。其中的邏輯是更易於理解:「將所有表中的第一個表,與來自其他表的匹配列
  • 沒有必要選擇county_id兩次
+0

感謝這@GordonLinoff,但這仍然給我在下拉列表中的重複縣。因爲它顯示每個'證明'的每個'縣',有或沒有DISTINCT。 –

+0

使用'distinct'並移除證明標識。 –

0

http://sqlfiddle.com/#!6/4bcc2/11

SELECT TOP 1 WITH TIES 
p.county_id p_county_id, c.county_id c_county_id, c.county_name, t.testimonial_id, t.message 
FROM properties p 
LEFT JOIN counties c 
    ON p.county_id = c.county_id 
RIGHT JOIN testimonials t 
    ON p.property_id = t.property_id 
ORDER BY 
    ROW_NUMBER() OVER(PARTITION BY p.county_id ORDER BY [testimonial_id]); 
+0

尼斯查詢獲得每縣的第一次見證,但一方面,我不認爲這是問,另一個問題是在MySQL上,而不是SQL Server。 –