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

SQLで関係除算(基本代数式)を表現する方法

    関連する関係に対応するテーブルにこのDDLを指定すると、次のようになります。

    create table Boats(
      bid int,
      bname varchar(50),
      color varchar(50)
    );
    
    create table Reserves(
      sid int,
      bid int,
      day date
    );
    

    除算式(3)は、冗長ですが、かなり簡単にOracleSQL構文に音訳できます。

    -- All sailors who reserved at least one boat
    SELECT DISTINCT sid
    FROM Reserves
    
    MINUS 
    
    -- All sailors who reserved at least one boat, but not all of them
    SELECT sid
    FROM (
      -- all combinations of a sailor who reserved any boat with any boat
      -- available to be reserved:
      SELECT Reserves.sid, Boats.bid
      FROM
        Reserves
        CROSS JOIN
        Boats
    
      MINUS
    
      -- all combinations of sailor and boat for actual reservations made
      SELECT sid, bid
      FROM Reserves
    ) sids
    

    指定されているように、それはCROSS JOINのみを使用します およびMINUS 関係代数の公式に直接対応するように操作します。ただし、実際のデータベースアプリケーションでは、まったく異なるクエリを使用して同じ結果を確実に取得できます。

    また、SQLデータベースは、関係に重複するタプルが含まれないという正式な関係代数の原則に違反する可能性があり、実際に違反していることにも注意してください。それがSELECT DISTINCTの理由です 最初のサブクエリで。クエリの他の場所で戦略的に適用された個別の選択は、より効率的になる可能性がありますが、結果は変わりません。



    1. 選択したチェックボックスをデータベースに追加する-PHP

    2. 私の単純なMySqlクエリはインデックスを使用しません

    3. MySQL Select ...インデックスで更新するには、同時実行の問題があります

    4. ORA-01830:入力文字列全体を変換する前に日付形式の画像が終了します