2

私はSQLステートメントを持っています-私には説明できません-奇妙な振る舞い。おそらくあなたは何が悪いのかを見つけることができます:

私がステートメントを使用するとき

select count(*) from department

2755件の結果がありました

次のステートメントを使用する

select 
      building1.street, building1.streetno, building1.plz, building1.city, dept1.buildingid
  from 
      department dept1
    left join 
      supporter sup 
    on 
      dept.supporterid = sup.id
    left join 
      building building1
    on 
      sup.buildingid = building1.ibuildingid
  where 
      dept.usepostaladresssupporter = 1 
  union all
  select 
      building2.street, building2.streetno, building2.plz, building2.city, dept2.buildingid
  from 
      building building2
    right join 
      tueks_department dept2 
    on 
      dept2.buildingid = building2.ibuildingid
  where 
      dept2.usepostaladresssupporter = 0

私も2755の結果を得ました。しかし、2つのステートメントを左結合で結合したい場合:

select count(*) from department
  left join
    (
      select 
          building1.street, building1.streetno, building1.plz, building1.city, dept1.buildingid
      from 
          department dept1
        left join 
          supporter sup 
        on 
          dept.supporterid = sup.id
        left join 
          building building1
        on 
          sup.buildingid = building1.ibuildingid
      where 
          dept.usepostaladresssupporter = 1 
      union all
      select 
          building2.street, building2.streetno, building2.plz, building2.city, dept2.buildingid
      from 
          building building2
        right join 
          tueks_department dept2 
        on 
          dept2.buildingid = building2.ibuildingid
      where 
          dept2.usepostaladresssupporter = 0
    ) postadress
  on
     department.buildingid = postadress.buildingid;

3648513の結果が得られました。

私の期待は、2755の結果しか得られないということでした。どこが間違っているのですか?

手伝ってくれてありがとう!

4

2 に答える 2

3

私はそれbuildingidがユニークではないと思います(私の推論では、それはユニークではありえません)

次の簡単な表を想像してみてください

TableA

create TableA (name VARCHAR(32));
insert into TableA values ('Lieven');
insert into TableA values ('Lieven');      

TableB

create TableB (name VARCHAR(32));
insert into TableB values ('Lieven');
insert into TableB values ('Lieven');
insert into TableB values ('AnyOtherValue');

ステートメントを選択

select * from TableA a left outer join TableB b on a.name = b.name

の各レコードは、が等しい場所のレコードTableAと一致するため、4つのレコードになります(AnyOtherValueは一致しないため、却下されます)TableBname

  • の最初のレコードはTableA、`TableB'の3つのレコードのうちの2つとともに返されます。
  • の2番目のレコードはTableA、`TableB'の3つのレコードのうちの2つとともに返されます。
于 2013-01-24T14:06:09.970 に答える
1

クエリ

select 
      building1.street, building1.streetno, building1.plz, building1.city, dept1.buildingid
  from 
      department dept1
    left join 
      supporter sup 
    on 
      dept.supporterid = sup.id
    left join 
      building building1
    on 
      sup.buildingid = building1.ibuildingid
  where 
      dept.usepostaladresssupporter = 1 
  union all
  select 
      building2.street, building2.streetno, building2.plz, building2.city, dept2.buildingid
  from 
      building building2
    right join 
      tueks_department dept2 
    on 
      dept2.buildingid = building2.ibuildingid
  where 
      dept2.usepostaladresssupporter = 0

usepostaladresssupporterが0または1のいずれかである部門ごとに1行を返します(他の値のレコードは含まれないことに注意してください。これは、この列の制約に応じて問題になる場合とそうでない場合があります)。

このクエリ結果の一意のキーは、おそらくdepartmentidのようなものです(選択した条件にその列を含める必要があります)。

したがって、正しいクエリは次のようになります。

select * from department
  left join
    (
      select 
          building1.street, building1.streetno, building1.plz, building1.city, dept1.departmentid
      from 
          department dept1
        left join 
          supporter sup 
        on 
          dept.supporterid = sup.id
        left join 
          building building1
        on 
          sup.buildingid = building1.ibuildingid
      where 
          dept.usepostaladresssupporter = 1 
      union all
      select 
          building2.street, building2.streetno, building2.plz, building2.city, dept2.departmentid
      from 
          building building2
        right join 
          tueks_department dept2 
        on 
          dept2.buildingid = building2.ibuildingid
      where 
          dept2.usepostaladresssupporter = 0
    ) postadress
  on
     department.departmentid = postadress.departmentid;

次のようなデータでは、クエリが失敗します。

DepartmentidBuildingId名

11部1

22部門2

32部門3

乗算効果は、deptcount * deptcountとは完全に等しくありませんが、buildingcount * buildingcount + deptcount--buildingcountです。

于 2013-01-24T14:18:46.863 に答える