(ここに初めて投稿すると、投稿するのは馬鹿なことではないと思っています。テキストを読んでみたくない場合は、コードを読んでください。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つの作業、他方は動作しません
まず、あなたの答えをありがとう!したがって、2つの「サブ結果」の「連合」を実行するために「or」を使用する方が通常は良いですか? ああ、私はまだ最初のオプションがエラーにつながった理由について不思議です。あなたはそれを手伝ってもらえますか? – Slna
バグに関連しているようです。https://jira.mariadb.org/browse/MDEV-10028 –
@Sina。 。 。最初のバージョンでエラーが返される理由はわかりませんが、構文の違いを理解しているようです。 「それはクエリパーサーがどのように動作するように見えるか」以外のことはあまりありません。クエリのパフォーマンス上の問題は、 'union'または' distinct distinct'のいずれかが重複を削除するために余分な作業を必要とすることです。 –