13.3. ����ȷ�� JOIN �����ӣ����ƹ滮��

���ǿ�����һ���̶�������ȷ��JOIN�﷨���Ʋ�ѯ�滮���� Ҫ����Ϊʲô������£�����������ҪһЩ����֪ʶ��

�ڼ򵥵����Ӳ�ѯ�����

SELECT * FROM a,b,c WHERE a.id = b.id AND b.ref = c.id;

�滮�����԰����κ�˳�����ɵ����Ӹ����ı� ���磬����������һ����ѯ�滮����WHERE�Ӿ� a.id = b.id �� A ���ӵ� B��Ȼ��������һ��WHERE�Ӿ�� C ���ӵ������������ ������Ҳ���������� B �� C Ȼ�������� A�� Ҳ�õ���������������Ҳ�������� A �� C Ȼ��ѽ���� B ���ӣ� ������ô��Ч�ʱȽϲ��Ϊ�������������� A �� C �ĵϿ������� ���ڲ�ѯ��û�п��õ�WHERE�Ӿ�����Ż������ӡ� ��PostgreSQL ִ��������������Ӷ����������������֮�䣬����������������������ȵó�һ��������� ��Ҫ��һ������Щ���ӷ�ʽ������������ͬ�Ľ��������ִ�п�����ȴ�����о޴�IJ�� ��ˣ��滮��������ǽ��м�鲢�ҳ����Ч�IJ�ѯ�滮��

�����ѯֻ�漰������������ô�ڲ�ѯ�ﲻ����̫����Ҫ���ǵ����ӡ� ����DZ�ڵ�����˳�����Ŀ���ű���Ŀ�����ӳ�ָ�����ӵ����ơ� ������ʮ�����ҵı��Ժ�ʵ���ϸ��������ܶ����п�����һ����������� ���������߸�����Ҫ�൱����ʱ����й滮�� �����̫������ı�PostgreSQL �滮��������������л�Ϊ�������������� �Լ��ٿ�������Ŀ�������ռ䣩�� ���л�����ֵ��������ʱ���� geqo_threshold ���õġ��� ������������ʱ���٣����Dz���һ�����ҵ���õĹ滮��

����ѯ�漰�ⲿ����ʱ���滮���Ͳ���Ը���ͨ���ڲ���������ô�����ˡ� ���磬�������������ѯ

SELECT * FROM a LEFT JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);

���������ѯ��Լ����ǰ��һ���dz����ƣ������ǵ�����ȴ��ͬ�� ��Ϊ��� A �����κ�һ�в���ƥ�� B �� C ����������У� ��ô���ж�����������������滮��������˳��û��ʲôѡ�� ������������ B �� C��Ȼ��� A ���ӵ��ý���ϡ���ˣ� �����ѯ��ǰ��һ�����ڹ滮�ϵ�ʱ���١�

��ȷ�������﷨��INNER JOIN��CROSS JOIN�� ���������ε� JOIN�������Ϻͺ� FROM �� �г������ϵ��һ���ģ��������û�б�ҪԼ������˳�� �������ǿ��Ը��� PostgreSQL �IJ�ѯ�滮������ȷ���� JOIN ����Լ��˳�� ���磬����������ѯ�߼����ǵ�Ч�ģ�

SELECT * FROM a, b, c WHERE a.id = b.id AND b.ref = c.id;
SELECT * FROM a CROSS JOIN b CROSS JOIN c WHERE a.id = b.id AND b.ref = c.id;
SELECT * FROM a JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);

��������Ǹ��߹滮������ JOIN ��˳����ô�ڶ����͵���������Ҫ�ȵ�һ�����ڹ滮�ϵ�ʱ���١� ������ö���ֻ������������Ӷ�����΢������ģ� ��������Ŀ�ڶ�ı����ܾ��Ǿ��������ˡ�

Ҫǿ�ƹ滮��Ϊ�ڲ��������ѭ JOIN ˳�����ǿ��԰�����ʱ���� join_collapse_limit ����Ϊ 1�� ���������ܵ���ֵ���������ۡ���

����ȫ����Ϊ����������ʱ����Լ������˳�� ��Ϊ��һ���򵥵�FROM�б���ʹ��JOIN�������ͺܺ��ˡ� ���磬

SELECT * FROM a CROSS JOIN b, c, d, e WHERE ...;

������� join_collapse_limit = 1����ô��仰���൱��ǿ�ȹ滮���Ȱ� A ���ӵ� B��Ȼ�������ӵ������ı��ϣ� ������Լ��������ѡ���ڱ����У����ܵ�����˳�����Ŀ������ 5 ����

����������뷨���ǹ滮��������������һ�������õļ��ɣ� �����ǶԼ��ٹ滮ʱ�仹�Ƕ������滮�����ɺõĹ滮�����а����� ���ȱʡʱ�滮��ѡ����һ����������˳�� �������JOIN�﷨ǿ����ѡ��һ�����õ� — ����֪��һ�����õ�˳���������ǽ�������顣

һ���dz������Ӱ��滮ʱ��������ǰ��Ӳ�ѯѹ�������ǵĸ���ѯ���档���磬��������IJ�ѯ

SELECT *
FROM x, y,
    (SELECT * FROM a, b, c WHERE something) AS ss
WHERE somethingelse;

���������������ְ������ӵ���ͼ�г��֣�����ͼ��SELECT���򽫱����뵽������ͼ�ij��ϣ����ɷdz���������IJ�ѯ�� ͨ�����滮������ͼ���Ӳ�ѯѹ��������ѯ�����

SELECT * FROM x, y, a, b, c WHERE something AND somethingelse;

����ͨ��������һ���ȶ������Ӳ�ѯ����Щ�Ĺ滮�� �����磬���� WHERE �����������Ȱ� X ���ӵ� A �ϣ������������� A �е�����У� ��˱������γ�ȫ���Ӳ�ѯ�߼��������Ҫ��������ͬʱ�����������˹滮��ʱ�䣻 �����������һ������·���Ӵ���������������·���ӵ����⣬ �����IJ���Ǿ޴�ģ���Ϊ���ܵĹ滮�����ǰ���ָ�������ġ� �滮�����ڸ���ѯ���ܳ��� from_collapse_limit ��FROM���ʱ�򣬲���ѹ���Ӳ�ѯ�� �Դ�������޴�����������������⡣ �����ͨ�������������ʱ�������ڹ滮ʱ��͹滮����֮������ƽ�⡣

from_collapse_limit �� join_collapse_limit ��������ʱ��Ϊ�����������鼸����ͬ��һ�����ƹ滮�ں�ʱ���Ӳ�ѯ"ƽ�滯"�� ����һ�����ƺ�ʱ����ȷ��������ƽ�滯��ͨ������Ҫô�� join_collapse_limit ���óɺ� from_collapse_limit һ������������ȷ���Ӻ��Ӳ�ѯ����Ϊ���ƣ�Ҫô�� join_collapse_limit ����Ϊ 1�������������ȷ���ӿ�������˳�򣩡� ��������԰��������óɲ�ͬ��ֵ��������Ϳ����ڹ滮ʱ�������ʱ��֮�������ϸ�ĵ��ڡ�