sql - Oracle 语句计数不正确

标签 sql oracle

我有一个 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 个结果。 但是当我想用左连接组合这两个语句时:

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 个结果。 哪里错了?

感谢您的帮助!

最佳答案

我假设 buildingid 不是唯一的(根据我的推理,它不可能是唯一的)

想象一下下面的简单表格

表A

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

表B

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每条记录与TableB每条记录相匹配,其中name 相等,这将导致 4 条记录(AnyOtherValue 由于不匹配而被忽略)

  • TableA 的第一条记录与“TableB”的三个记录中的两个一起返回
  • TableA 的第二条记录与“TableB”的三个记录中的两个一起返回

关于sql - Oracle 语句计数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14503065/

相关文章:

SQL:军事时间转换后在 AM/PM 之前添加空格

css - 如何使用 CSS 格式化 Oracle APEX 区域项?

sql - 如何使用 regexp_substr 拆分 oracle 中的单词?

java - 如何将我在结果集中所做的更改转换为 java 中的 sql 查询?

javascript - 如何根据 Oracle Apex 中的选择列表选项显示/隐藏文本字段?

mysql - 有人可以告诉我这段sql代码做错了什么吗

SQL-Query - 查找另一个表的模式

mysql - 使用 SELECT CASE 和 SUM : MYSQL

java - 远程连接的 mysql 服务器的数据库 URL 到底是什么?

sql - Oracle/Toad 期望什么日期格式?