2017-10-13 24 views
0

不必編寫返回的姓名,城市,而這坐落在一個獨特的城市和國家的每個供應商的狀態的select語句獨特的效果。我看到了幾個類似的線程,但沒有給出的答案有助於某種原因。我的代碼仍然無法返回適當數量的結果:問題嘗試選擇在MySQL子查詢

編寫一條select語句,該語句返回位於獨特城市和州中的每個供應商的名稱,城市和州。它需要返回38行。

/*problem 6*/ 

SELECT 
vendor_name, vendor_city, vendor_state 
FROM 
vendors 
WHERE 
vendor_city || vendor_state NOT IN (SELECT distinct 
     vendor_city || vendor_state 
    FROM 
     vendors 
    GROUP BY vendor_city, vendor_state having count(*)>1) 
ORDER BY vendor_state , vendor_city; 
+0

是你的子查詢返回正確的數據? –

+1

任何一組'GROUP BY'列都將是唯一的,所以'DISTINCT'是多餘的。雖然在一個「IN」條款中,重複不會產生任何影響。串聯('||')會減慢比較 - 你應該能夠比較元組:'WHERE(vendor_city,vendor_state)NOT IN(...)'。除了像teju提到的子查詢檢查之外,你會得到什麼結果?行數太多,行數太少?如果您翻轉您訂購的那一列,會發生什麼? –

+0

在MySQL中,「||」運算符是「OR」的同義詞,而不是字符串連接。如果我們想要字符串連接,我們使用'CONCAT()'函數。 (注意連接的邊緣情況,因爲狀態和城市的連接在兩種情況下產生相同的值,所以可能匹配狀態='aa'city ='a'且狀態='a'city ='aa'。 – spencer7593

回答

1

該查詢應滿足規範的一個可能的解釋:

SELECT MIN(v.vendor_name) AS vendor_name 
     , v.vendor_city 
     , v.vendor_state 
    FROM vendors v 
    GROUP 
     BY v.vendor_city 
     , v.vendor_state 
    HAVING COUNT(*) = 1 

這是獲得(city,state)元組,以及計數具有相同值的行的數量,並且不包括任何其中多於一行具有相同的值。剩下的行中將只有一個vendor_name返回。

(該規範也可能被不同的方式在多個(city,state)解釋例如,相同vendor_name,我們正在想返回只在一個(city,state)發生的vendor_name。這將需要一個不同的查詢。)


在MySQL的擴展允許我們離開過聚合函數,如果ONLY_FULL_GROUP_BYsql_mode包括也就是說,我們可以只用v.vendor_name取代MIN(v.vendor_name)

如果有,我們必須使用嵌套查詢的一些要求,我更喜歡使用內嵌視圖返回「獨特的城市和國家」,然後連接操作。

SELECT t.vendor_name 
     , t.vendor_city 
     , t.vendor_state 
    FROM (SELECT v.vendor_city 
       , v.vendor_state 
      FROM vendors v 
      GROUP 
       BY v.vendor_city 
       , v.vendor_state 
      HAVING COUNT(*) = 1 
     ) u 
    JOIN vendors t 
     ON t.vendor_city <=> u.vendor_city 
    AND t.vendor_state <=> u.vendor_state 
    ORDER 
     BY t.vendor_name 
0

尋求積極響應通常更高效。因此,不要找到那些比城市/州更多的供應商(然後使用NOT來反轉),而是先做相反的處理,然後尋找那些擁有單一城市/州的供應商。然後使用更直接的方法通過使用inner join來完成最終輸出。

SELECT 
     v.vendor_name 
    , v.vendor_city 
    , v.vendor_state 
FROM vendors AS v 
INNER JOIN (
     SELECT 
      vendor_city 
      , vendor_state 
     FROM vendors 
     GROUP BY 
      vendor_city 
      , vendor_state 
     HAVING COUNT(*) = 1 
) AS d ON v.vendor_city = d.vendor_city 
     AND v.vendor_state = d.vendor_state 
ORDER BY v.vendor_state, v.vendor_city;