1
|----------------------------|
|  Tbl_1                     |
|--------------|-------------|
|  id          |  name_1     |
|--------------|-------------|
|  1           |  t_1_rec_1  |
|--------------|-------------|

|------------------------------------------------------------|
|  Tbl_2                                                     |
|-------|--------------|-----------|------------|------------|
|  id   |  name_2      | tbl_1_id  |  tbl_3_id  |  tbl_4_id  |
|-------|--------------|-----------|------------|------------|
|  1    | t_2_rec_1    | 1         | 1          |  2         |
|  2    | t_2_rec_2    | 1         | 2          |  1         |
|-------|--------------|-----------|------------|------------|

|------------------------|
|  Tbl_3                 |
|----------|-------------|
|  id      |  name_3     |
|----------|-------------|
|  1       |  t_3_rec_1  |
|  2       |  t_3_rec_2  |
|----------|-------------|

|----------------------|
|  Tbl_4               |
|--------|-------------|
|  id    |  name_4     |
|--------|-------------|
|  1     |  t_4_rec_1  |
|  2     |  t_4_rec_2  |
|--------|-------------|


|--------------------------------------------|
| Tbl_5                                      |
|------|------------|------------|-----------|
|  id  |  name_5    |  tbl_2_id  | tbl_6_id  |
|------|------------|------------|-----------|
|  1   | t_5_rec_1  |  1         | 1         |
|  2   | t_5_rec_2  |  1         | 2         |
|------|------------|------------|-----------|

|----------------------------------|
|  Tbl_6                           |
|-------|------------|
|  id   | name_6     |
|-------|------------|
|  1    | t_6_rec_1  |
|  2    | t_6_rec_2  |
|-------|------------|

私はこれらの結果を期待しています:

t1.name_1  t2.name_2  t3.name_3  t4.name_4  t5.name_5   t6.name_6

t_1_rec_1  t_2_rec_1  t_3_rec_1  t_4_rec_2  t_5_rec_1   t_6_rec_1
t_1_rec_1  t_2_rec_1  t_3_rec_1  t_4_rec_2  t_5_rec_2   t_6_rec_2
t_1_rec_1  t_2_rec_2  t_3_rec_2  t_4_rec_1

select t1.name_1, t2.name_2, t3.name_3, t4.name_4, t5.name_5, t6.name_6
from Tbl_1 as t1
left join Tbl_2 as t2 on t2.id = t1.id
inner join Tbl_3 as t3 on t2.tbl_3_id = t3.id
inner join Tbl_4 as t4 on t2.tbl_4_id = t4.id
left join Tbl_5 as t5 on t5.id = t2.id
inner join Tbl_6 as t6 on t2.tbl_6_id = t6.id

しかし、これは機能しません!!!!! 3 行目は返されません。最後の内部結合 (Tbl_6) を左結合に変更すると、3 行目が生成されます。

Tbl_5 と Tbl_6 の間の内部結合によって Tbl_5 レコードが生成されないことは理解していますが、Tbl_2 と Tbl_5 の間の左結合によって Tbl_2 が生成され、その内部結合された Tbl_3 および Tbl_4 レコードがそこに存在し、Tbl_1 の結果として生じると予想されます。 Tbl_2 に左結合して、3 行目を取得します。

私は何が欠けていますか?(後でTbl_6エントリを持たないTbl_5レコードが必要ないため、内部結合を変更する必要はありません)また、このクエリはZend Dbクラスから生成され、できる必要がありますそれに答えを組み込みますが、適切に機能するクエリがある場合、または期待どおりに機能するクエリがある場合は、Zend にそれを生成させる方法を考えます...

4

1 に答える 1

0

SQL (および MySQL) では、、、、inner joinおよびleft outer join操作right outer joincross join優先順位はすべて同じです。そうa left join b inner join cです(a left join b) inner join c。同様に、算術式1 - 2 + 3は is (1 - 2) + 3and not1 - (2 + 3)です。

fromこれを念頭に置いて、あなたの条項を見てみましょう:

from Tbl_1 as t1
left join Tbl_2 as t2 on t2.id = t1.id
inner join Tbl_3 as t3 on t2.tbl_3_id = t3.id
inner join Tbl_4 as t4 on t2.tbl_4_id = t4.id
left join Tbl_5 as t5 on t5.id = t2.id
inner join Tbl_6 as t6 on t2.tbl_6_id = t6.id

最初の内部結合はt2.tbl_3_id = t3.id. t2.tbl_3_idテーブルに一致するものがない場合、列は NULLt1になりt2ます。NULL値が一致しないため、最初の結合が内部結合になります。

次のような構文でこれを修正できます。

inner join Tbl_3 as t3 on t2.tbl_3_id = t3.id or t2.id is null

(NULL 比較は、有効な一致で id が NULL である可能性がある場合に備えてでt2.idはなく、 .)t2.tbl_3_id

後続の結合に対してこのロジックを続行できます。

外部結合と内部結合を混在させても、外部結合が内部結合に自動的に変換されるわけではありません。onそれは条項の条件によって異なります。

個人的には、結合のセマンティクスに従うのはかなり面倒だと思います。内部結合のみ、または左外部結合のみを使用して、ほとんどすべてのクエリを作成します。つまり、すべてが一致する行を保持するか、すべての行を最初のテーブルに保持します。

結合タイプを混在させたい場合は、2 つのオプションがあります。1 つ目は、サブクエリを使用することです。これは、MySQL ではパフォーマンスの問題を引き起こす可能性があります。または、left outer joins を使用して句に条件を追加し、where必要なロジックを実行します。

于 2013-05-11T22:45:13.800 に答える