2016-12-14 9 views
1

(ここに初めて投稿すると、投稿するのは馬鹿なことではないと思っています。テキストを読んでみたくない場合は、コードを読んでください。SQL - 連合の選択肢の中で...

今日、(映画データベースの文脈で)特定の俳優と同じシーンに出演する俳優を知ることを可能にするクエリを作成する必要がありました。私は、テーブルの詳細は重要ではないと思う(しかし、私はそれらを投稿することができます)。私はスクリプトのIDシーンを与えた

私のクエリを書いている間、私は最初、私は2つのクエリの結果の連合を実行しなければならなかったことに気づいたが(の一部であり、その内部のシーンの順序スクリプト)を選択し、そのシーンからすべてのアクタを選択します。シーンはアクションパートとスピーチラインに分けられ、アクターはシーンに直接接続されず、シーンに直接接続されません。

私はすでに答えがあります(私はまだ別の組合を行う必要がありますが、それは簡単です)が、なぜ動作するのか、そしてなぜ私の最初の答えが働かないのか理解したい。私がしたのは括弧を取り除くことだけでした。

だから、この答えは、私はこのエラーを取得する

Select Distinct name 
From Staff S 
Inner join MChar_ActPart MCAP on S.stid=MCAP.aid 
Where (sid, sord) in ((Select Distinct sid, sord 
         From MChar_SpLine MCSL 
         Inner join Staff S on MCSL.aid = S.stid 
         Where name = 'John Idle')      
         Union 
         (Select Distinct sid, sord 
         From MChar_ActPart MCAP 
         Inner join Staff S on MCAP.aid = S.stid 
         Where name = 'John Idle')) 
And name != 'John Idle'; 

を動作しません。 "SQLエラー(1064):SQL構文にエラーがあります。MariaDBサーバーのバージョンに対応するマニュアルをチェックして、正しい構文を確認してください。 'Union(Select Distinct sid、sordFrom MChar_ActPart MCAPInner join Staff S'

しかし、この1は、作業を行います:。?違う

Select Distinct name 
From Staff S 
Inner join MChar_ActPart MCAP on S.stid=MCAP.aid 
Where (sid, sord) in (Select Distinct sid, sord 
         From MChar_SpLine MCSL 
         Inner join Staff S on MCSL.aid = S.stid 
         Where name = 'John Idle' 
         Union 
         Select Distinct sid, sord 
         From MChar_ActPart MCAP 
         Inner join Staff S on MCAP.aid = S.stid 
         Where name = 'John Idle') 
And name != 'John Idle'; 

唯一のものはカッコあるなぜ1つの作業、他方は動作しません

答えて

0

表示されているエラーは、(SELECT ...)UNION(SELECT ...))を実行しているときに、MariaDBのバグに関連しています。

あなたは、このリンク上でバグのステータスを確認することができます:https://jira.mariadb.org/browse/MDEV-10028

注:私はあなたが直面している特定のエラーに正しい答えだと思うように、答えとしてこれを追加します。

1

unionselect distinctは冗長である私がします。クエリを次のように書くことを強くお勧めします:

Select Distinct name 
From Staff S Inner join 
    MChar_ActPart MCAP 
    on S.stid = MCAP.aid 
Where ((sid, sord) in (Select sid, sord 
         From MChar_SpLine MCSL Inner Join 
          Staff S 
          on MCSL.aid = S.stid 
         Where name = 'John Idle' 
        ) or 
     (sid, sord) in (Select sid, sord 
         From MChar_ActPart MCAP Inner Join 
          Staff S 
          on MCAP.aid = S.stid 
         Where name = 'John Idle' 
        ) 
    ) and 
     name <> 'John Idle'; 

このバージョンを最適化する範囲がはるかにあります。

+0

まず、あなたの答えをありがとう!したがって、2つの「サブ結果」の「連合」を実行するために「or」を使用する方が通常は良いですか? ああ、私はまだ最初のオプションがエラーにつながった理由について不思議です。あなたはそれを手伝ってもらえますか? – Slna

+1

バグに関連しているようです。https://jira.mariadb.org/browse/MDEV-10028 –

+0

@Sina。 。 。最初のバージョンでエラーが返される理由はわかりませんが、構文の違いを理解しているようです。 「それはクエリパーサーがどのように動作するように見えるか」以外のことはあまりありません。クエリのパフォーマンス上の問題は、 'union'または' distinct distinct'のいずれかが重複を削除するために余分な作業を必要とすることです。 –

0

2 *

WHERE (a,b) ...は最適化されていません。それを避けてください。

IN (SELECT ...)は現在よく最適化されています。それを避けてください。

、それによって両方ouchiesを避け、裏返しクエリをオンにする「派生サブクエリ」を使用します。すべての

SELECT ... 
    FROM ((SELECT sid, sord FROM ...) 
      UNION ALL -- or DISTICT 
      (SELECT sid, sord FROM ...) 
     ) AS u 
    JOIN ... AS x 
     ON x.sid = u.sid 
     AND x.sord = u.sord 
    ... 
関連する問題