sql >> データベース >  >> RDS >> SQLite

SQLiteEXCEPT演算子

    SQLiteでは、EXCEPT 演算子を使用して、複合SELECTを作成できます 左側のSELECTによって返される行のサブセットを返すステートメント 正しいSELECTによって返されないもの 。

    次のテーブルがあるとします。

    SELECT * FROM Teachers;
    SELECT * FROM Students;

    結果:

    TeacherId  TeacherName
    ---------  -----------
    1          Warren     
    2          Ben        
    3          Cathy      
    4          Cathy      
    5          Bill       
    6          Bill       
    
    StudentId  StudentName
    ---------  -----------
    1          Faye       
    2          Jet        
    3          Spike      
    4          Ein        
    5          Warren     
    6          Bill       

    EXCEPTを使用できます 生徒ではない教師を返すためのオペレーター:

    SELECT TeacherName FROM Teachers
    EXCEPT
    SELECT StudentName FROM Students;

    結果:

    TeacherName
    -----------
    Ben        
    Cathy      

    したがって、Teachersに表示される値のみを取得します Studentsにも表示されないテーブル テーブル。

    左側にあるテーブルと右側にあるテーブルに応じて、異なる結果を得ることができます。 Studentsを配置する例を次に示します。 左側の表とTeachers 右側:

    SELECT StudentName FROM Students
    EXCEPT
    SELECT TeacherName FROM Teachers;

    結果:

    StudentName
    -----------
    Ein        
    Faye       
    Jet        
    Spike      

    今回は、教師ではない生徒を迎えます。

    SQLiteのEXCEPT 演算子は個別の行のみを返します。したがって、この例では、Cathyに対して1行だけが返されます。 、その名前の先生が2人いるのに。

    他のいくつかのRDBMSでは、オプションのALLを受け入れることで、結果に重複を含めることができます。 EXCEPTを含むキーワード 演算子ですが、SQLiteはそうではありません(少なくとも、執筆時点ではそうではありません)。何か変更があった場合は、SQLiteのドキュメントを確認してください。

    代替案

    EXCEPTを使用しなくても同じ結果を得ることができます オペレーター。たとえば、最初の例を次のように書き直すことができます。

    SELECT 
        DISTINCT TeacherName
    FROM Teachers t 
    WHERE NOT EXISTS (SELECT StudentName FROM Students s
    WHERE t.TeacherName = s.StudentName);

    結果:

    TeacherName
    -----------
    Ben        
    Cathy      

    1. SQL Developerスクリプトの出力は、sys_refcursorの幅を切り捨てます

    2. 転送用のデータベースのエクスポート

    3. PythonでMySQLにCSVデータをロードする

    4. Oracleで日付をフォーマットするときに年を綴る方法