2010-12-11 3 views
0

私はleft join 2つのテーブルにしたいです。私の問題は、 "右"のテーブルがデータベースに存在しないということです。私はそれをクエリ中に作成する必要があります。より詳細には、「右」テーブルは、既存のテーブルから特定の行を抽出することによって得られる(select ... where ...)。参加前に選択できますか?

私は、解決策が最初にjoin、次にselectになると考えました。私はそれがelectjoinよりちょうど遅くなると思ったが、私はそれがまったく機能しないことに気付いた。例えば

左表:

| Dog | 1 | 
| Cat | 0 | 

右表:

| Dog | Paul | yes | 
| Cat | Carin | no | 

私は2番目の列が "カリン" を有する第2のテーブルからの行のみを使用したいです。私は私が得るそれらの行を選択した後、参加するのであれば、:

| Dog | 1 | Null | Null| 
| Cat | 0 | Carin | no | 

しかし、私が最初に参加する場合は、私が取得:

| Dog | 1 | Paul | yes | 
| Cat | 0 | Carin | no | 

そして、私はカリンと行を選択するならば、私が取得:

| Cat | 0 | Carin | no | 

したがって、結果が異なることがわかります。最初のケースでは2行、2番目のケースでは1行しか得られません。

だから、参加する前に選択することは可能ですか?

答えて

2

私は、結合ステートメントの一部として定義されたサブクエリで作成されたフィールドを参照することについて話していると思います。このような何か:この中

SELECT a.id, b.name 
    FROM table AS a 
    LEFT JOIN 
    (SELECT name FROM table2) AS b 
    ON a.id = b.id 

、あなたはb.nameのみクエリで後に作成されたサブクエリの一部として存在していてもb.name参照しています。

これが意味するものなら、あなたは絶対にそうすることができます。サブクエリに参加できない場合、サブクエリに参加する理由はほとんどありません。

私があなたの意思と間違っている場合は、問題にもっと鮮明に見えるように、質問に実行したい実際のクエリを追加してください。

+0

これは私が必要としていたものです。どうもありがとう! – Roman

+0

実際、このクエリはとても自然なので、このようにしなければならないと私は推測できます(しかし、私はしませんでした)。 – Roman

+2

それについて自分自身を打ち負かすことはありません。誰もがどこかから始まり、専門家でさえその知識にギャップがあります。つまり、試行錯誤は学ぶのに最適な方法です。 – AgentConundrum

1

また、定数で結合することもできます。基本的に、あなたは移動し、ON句にWHERE句内の式:

SELECT a.pet, a.neutered, b.name, b.allergic 
    FROM a 
    LEFT JOIN b 
    ON a.pet=b.pet AND b.name='Carin'; 
0

例Outisからは私のために動作しませんでしたが、私はWHEREでANDを交換したときに、これは働いていました。

SELECT a.pet, a.neutered, b.name, b.allergic 
    FROM a 
    LEFT JOIN b 
    ON a.pet=b.pet WHERE b.name='Carin'; 
関連する問題