代码之家  ›  专栏  ›  技术社区  ›  GGSoft

RIGHT OUTER JOIN不适用于WHERE子句

  •  0
  • GGSoft  · 技术社区  · 10 年前

    假设我有两张桌子:

         CREATE TABLE `test_a` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
         `name` varchar(20) DEFAULT NULL,
         PRIMARY KEY (`id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    CREATE TABLE `test_b` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `A_id` int(11) NOT NULL,
      `Amount` float NOT NULL,
      `cat` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `test_b_ibfk_1` (`A_id`),
      CONSTRAINT `test_b_ibfk_1` FOREIGN KEY (`A_id`) REFERENCES `test_a` (`id`)
     ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
    

    在测试中,我输入了数据

    1,A
    2,B
    3,C

    在第二个表中,我输入了以下数据: 1, 1, 4.78, 1
    2, 2, 77, 1
    3, 1, 0.22, 1
    4, 2, 13, 1

    任务是:要选择按a_id分组的所有金额的总和,必须显示test_a中的所有数据。 因此,我使用右外部联接。 当我运行以下查询时:

    SELECT a.name, sum(b.amount)
      FROM test_b AS b RIGHT OUTER JOIN test_a AS a ON b.A_id = a.id
     GROUP BY b.A_id;
    

    这将产生所需的结果集。这样地: C—空
    A--5
    B--90

    但当我使用WHERE子句时:

              SELECT a.name, sum(b.amount)
              FROM test_b AS b RIGHT OUTER JOIN test_a AS a ON b.A_id = a.id
              **where b.cat =1**
               GROUP BY b.A_id;
    

    我得到的结果是: A--5
    B--90

    我的问题是:如何使用WHERE子句实现相同的结果。(我希望出现C null)

    提前感谢!!!

    1 回复  |  直到 10 年前
        1
  •  1
  •   VMai    10 年前

    您必须将连接表b的条件包含在ON条件中:

    SELECT a.name, sum(b.amount) 
    FROM 
        test_b AS b 
    RIGHT OUTER JOIN 
        test_a AS a 
    ON 
        b.A_id = a.id AND b.cat =1 
    GROUP BY b.A_id;
    

    因为如果在WHERE子句中使用,它会将OUTER JOIN隐式更改为INNER JOIN。