2017-10-13 9 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'とstate = '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は1つだけです。

(スペックは、複数の(city,state)に同じvendor_name例えば異なって解釈される可能性があります、そして我々は、単一の(city,state)にのみ発生しvendor_nameを返したいと思っている。別のクエリを必要とすること。)


MySQLの拡張機能では、ONLY_FULL_GROUP_BYsql_modeに含まれていない場合、つまりMIN(v.vendor_name)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

一般的に肯定応答を求める方が効率的です。したがって、都市/州以上のベンダーを見つけ出すのではなく、それを逆転するのではなく、使用するベンダーを見つけるのではなく、逆の立場を取って、都市/州が単一のものを探すだけです。次に、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; 
関連する問題