从SQL联接查询获取所需输出时出现问题
正在尝试从多个SQL表中提取数据。我有一个主表和两个子表。我希望在给定条件的情况下从主表中获取所有行,并从子表中添加一些字段。我想一个外部连接应该可以工作,但我没有得到全部数据 当我在主表上运行计数时,条件是我得到~10k行,这是我加入其他表后期望得到的。我知道我将在某些行条目上获得空值 这是我提出的问题,但我只得到部分结果从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
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。如果表中的多个行与联接条件匹配,则会得到重复的行。