从SQL联接查询获取所需输出时出现问题

从SQL联接查询获取所需输出时出现问题,sql,oracle,left-join,Sql,Oracle,Left Join,正在尝试从多个SQL表中提取数据。我有一个主表和两个子表。我希望在给定条件的情况下从主表中获取所有行,并从子表中添加一些字段。我想一个外部连接应该可以工作,但我没有得到全部数据 当我在主表上运行计数时,条件是我得到~10k行,这是我加入其他表后期望得到的。我知道我将在某些行条目上获得空值 这是我提出的问题,但我只得到部分结果 SELECT main_table.group_id, main_table.floor, sub_table1.Name, sub_table2.base FROM ma

正在尝试从多个SQL表中提取数据。我有一个主表和两个子表。我希望在给定条件的情况下从主表中获取所有行,并从子表中添加一些字段。我想一个外部连接应该可以工作,但我没有得到全部数据

当我在主表上运行计数时,条件是我得到~10k行,这是我加入其他表后期望得到的。我知道我将在某些行条目上获得空值

这是我提出的问题,但我只得到部分结果

SELECT main_table.group_id, main_table.floor, sub_table1.Name, sub_table2.base
FROM main_table
LEFT JOIN ON main_table.group_id =sub_table1.group_id
LEFT JOIN ON main_table.group_id =sub_table2.group_id
WHERE main_table.year = 2000 AND sub_table1.year = 2000 
AND sub_table2.year = 2000 AND main_table.group = 'C'
我希望看到一个大约10k行的集合,因为这是我仅使用where子句查询主表时得到的数字

SELECT COUNT(*) FROM main_table WHERE year = 2000 AND group = 'C';
where子句从外部联接中过滤出额外的行,有效地将它们转换为内部联接

除第一个表外,所有表的条件都应在on子句中。但我要说的是:

SELECT main_table.group_id, main_table.floor, sub_table1.Name, sub_table2.base
FROM main_table LEFT JOIN
     sub_table1
     ON main_table.group_id = sub_table1.group_id AND
        main_table.year = sub_table1.year LEFT JOIN
     sub_table2
     ON main_table.group_id = sub_table2.group_id AND
        main_table.year = sub_table2.year
WHERE main_table.year = 2000 AND main_table.group = 'C';
你希望年数相等,所以这应该是一个连接条件。然后,您只需要在WHERE子句中指定一次年份。

ON子句中的任何条件用于联接,WHERE子句中的条件用于筛选出最终结果

除了gordon的答案外,如果您的要求是在联接中包含不同/相同的年份,那么您可以使用以下查询:

SELECT main_table.group_id, main_table.floor, sub_table1.Name, sub_table2.base
FROM main_table LEFT JOIN
     sub_table1
     ON (main_table.group_id = sub_table1.group_id AND
        sub_table1.year = 2000) LEFT JOIN
     sub_table2
     ON (main_table.group_id = sub_table2.group_id AND
        sub_table2.year = 2000)
WHERE main_table.year = 2000 AND main_table.group = 'C';

干杯

我会在这个查询中得到重复项的原因是什么?我得到的值比预期结果高出约2k。@itms。如果表中的多个行与联接条件匹配,则会得到重复的行。