[SQL] 크로스 조인을 사용하여 두 테이블 사이에 쉼표를 넣어의 차이점은 무엇입니까?
SQL크로스 조인을 사용하여 두 테이블 사이에 쉼표를 넣어의 차이점은 무엇입니까?
차이 사이는 무엇인가
select * from A, B
과
select * from A cross join B
? 그들은 같은 결과를 반환하는 것.
두 번째 버전은 처음보다 선호되어 있습니까? 첫 번째 버전은 완전히 구문 잘못인가?
해결법
-
==============================
1.그들은 의미와 동일하기 때문에 그들은 같은 결과를 반환합니다. 이:
그들은 의미와 동일하기 때문에 그들은 같은 결과를 반환합니다. 이:
select * from A, B
(윈스) ANSI-89 구문이다. 함께 테이블을 연결하는 WHERE 절없이, 결과는 카티 제품입니다. 뿐만 아니라 제공하는 기능 대체 정확히 어떤이다 :
select * from A cross join B
...하지만 CROSS JOIN을 ANSI-92 구문입니다.
그들 사이에 성능 차이가 없습니다.
ANSI-89 구문 많은 데이터베이스는 다른 데이터베이스에 포트를하지 않는 (자신의 구현, 어떤이없는 - : ANSI-92 구문을 사용하는 이유는 외부 지원을 가입하기 위해 (LEFT, FULL, RIGHT는 IE) 인 ). IE : 오라클의 (+), SQL 서버의 = *
-
==============================
2.다른 SO 질문에서이 게시물에 우연히,하지만 큰 차이는 크로스가 생성 조인 연결합니다. 또는 다른 적용은 제 ( '쉼표') 변형 B에 가입 한 후 교차하여 예를 들어, 크로스 적용하거나 만 도트 후 테이블 (들)를 참조 할 것 조인. 예컨대, 다음과 같은 :
다른 SO 질문에서이 게시물에 우연히,하지만 큰 차이는 크로스가 생성 조인 연결합니다. 또는 다른 적용은 제 ( '쉼표') 변형 B에 가입 한 후 교차하여 예를 들어, 크로스 적용하거나 만 도트 후 테이블 (들)를 참조 할 것 조인. 예컨대, 다음과 같은 :
select * from A, B join C on C.SomeField = A.SomeField and C.SomeField = B.SomeField
오류를 만들 것입니다 :
(가) C에 참여하기 때문에 크로스 조인과 동일한 반면 만, B로 스코프 ...
select * from A cross join B join C on C.SomeField = A.SomeField and C.SomeField = B.SomeField
..is 괜찮 것으로 간주. 십자가를 사용하는 적용하는 경우 동일하게 적용됩니다. B가 교차 후의 기능에 적용 배치 예를 들어, 함수는 A와 B 모두에서 필드를 사용할 수 크로스와 같은 쿼리 조인 B의 필드를 사용할 수 있었다 물론,이 또한 역뿐만 아니라 사용될 수 있다는 것을 의미한다. 당신이이 테이블 중 하나만을 결합 추가하려는 경우, 당신은 테이블에 '쉼표'를 이동하여 그것을 달성 할 수있다.
-
==============================
3.그들은 동일하고 (거의) 사용해서는 안됩니다.
그들은 동일하고 (거의) 사용해서는 안됩니다.
-
==============================
4.첫 번째 버전은 원래 두 개의 테이블을 조인 할 수있는 유일한 방법이었다. (가) 키워드는 ANSI-92 표준에서 추가되었다 가입하기 때문에 그러나 그것은 문제의 번호가 있습니다. 그들은 같은 결과를 얻을 수 있지만, 두 번째는 더 명시하고 선호된다.
첫 번째 버전은 원래 두 개의 테이블을 조인 할 수있는 유일한 방법이었다. (가) 키워드는 ANSI-92 표준에서 추가되었다 가입하기 때문에 그러나 그것은 문제의 번호가 있습니다. 그들은 같은 결과를 얻을 수 있지만, 두 번째는 더 명시하고 선호된다.
-
==============================
5.이러한 암시 적 및 명시 적 크로스 조인의 예입니다. http://en.wikipedia.org/wiki/Join_%28SQL%29#Cross_join를 참조하십시오.
이러한 암시 적 및 명시 적 크로스 조인의 예입니다. http://en.wikipedia.org/wiki/Join_%28SQL%29#Cross_join를 참조하십시오.
-
==============================
6.간결 (호의)과 일관성 (CROSS JOIN을 선호) 외에, 유일한 차이는 우선 순위입니다.
간결 (호의)과 일관성 (CROSS JOIN을 선호) 외에, 유일한 차이는 우선 순위입니다.
쉼표는 다른 조인보다 낮은 우선 순위입니다.
예를 들어, 명시 적 형태의
SELECT * FROM a CROSS JOIN b JOIN c ON a.id = c.id
이다
SELECT * FROM ( a CROSS JOIN b ) INNER JOIN c ON a.id = c.id
이는 유효합니다.
의 명시적인 형태 반면
SELECT * FROM a, b JOIN c ON a.id = c.id
이다
SELECT * FROM a CROSS JOIN ( b INNER JOIN c ON a.id = c.id )
무효 인합니다 (절 참조를 액세스 할 수 없도록 가입).
당신의 예에서,이 두 테이블, 그래서 두 개의 쿼리는 정확히 동일합니다.
-
==============================
7.십자가의 유틸리티로 의견을 조인 크로스를 사용하여 하나 매우 유용하고 올바른 예 조인 또는 상호를 사용하여 포스트 그레스 generate_series과 PostGIS와 공간 SQL의 인정 하듯이 다소 모호한 세계에서 쉼표가를 추출하는 generate_series에 가입이 n 번째 기하 컬렉션 또는 다중 (다각형 / 포인트 / 선 스트링) 밖으로 기하학을 참조하십시오 http://postgis.refractions.net/documentation/manual-1.4/ST_GeometryN.html
십자가의 유틸리티로 의견을 조인 크로스를 사용하여 하나 매우 유용하고 올바른 예 조인 또는 상호를 사용하여 포스트 그레스 generate_series과 PostGIS와 공간 SQL의 인정 하듯이 다소 모호한 세계에서 쉼표가를 추출하는 generate_series에 가입이 n 번째 기하 컬렉션 또는 다중 (다각형 / 포인트 / 선 스트링) 밖으로 기하학을 참조하십시오 http://postgis.refractions.net/documentation/manual-1.4/ST_GeometryN.html
SELECT n, ST_AsEWKT(ST_GeometryN(the_geom, n)) As geomewkt FROM ( VALUES (ST_GeomFromEWKT('MULTIPOINT(1 2 7, 3 4 7, 5 6 7, 8 9 10)') ), ( ST_GeomFromEWKT('MULTICURVE(CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (10 11, 12 11))') ) ) As foo(the_geom) CROSS JOIN generate_series(1,100) n WHERE n <= ST_NumGeometries(the_geom);
당신은 지역 중심, 경계 상자 또는 그들이 더 큰 하나에 포함되어있을 때, 하나의 형상에서 수행 할 수있는 다른 작업을 많이 얻고 싶은 경우에 매우 유용 할 수 있습니다.
나는이 정말 의미 크로스이 게시물에 나를 데리고있는 가입 궁금 할 때 나는 항상 어느 날, generate_series 전에 쉼표를 사용하여 이러한 쿼리를 작성했습니다. 모호하지만 확실히 유용합니다.
-
==============================
8.이미 주어진 답변을 추가하려면 :
이미 주어진 답변을 추가하려면 :
select * from A, B
이는 1992 년 SQL 표준 이전에 가입하는 유일한 방법이었다. 내부 조인 당신이 원하는 경우에 따라서, 당신은 기준의 WHERE 절을 사용해야 할 것입니다 :
select * from A, B where A.x = B.y;
이 구문을 사용하여 하나의 문제는 외부 조인에 대한 표준이 없었다이었다. 또 다른이 많은 테이블을 읽을 얻고 오류 및 낮은 유지 보수에 따라서 경향이었다.
select * from A, B, C, D where B.id = C.id_b and C.id_d = D.id;
여기서 우리는 십자가 B / C / D와의 결합이있다. 목적에 아닌지? 아마 프로그래머는 단지와 B.id = A.id_b (또는 무엇이든), 아니면이 줄을 실수로 삭제, 어쩌면 아직도 정말 십자가에 가입 할 예정이었다 잊어 버렸습니다. 누가 말할 수 있을까?
여기에 명시 적 조인과 동일
select * from A cross join B inner join C on C.id_b = B.id inner join D on D.id = C.id_d;
더 이상 프로그래머의 의도에 대해 의심의 여지가.
오래된 쉼표로 구분 된 구문은 좋은 이유가 대체 더 이상 사용할 수 없습니다.
from https://stackoverflow.com/questions/3918570/what-is-the-difference-between-using-a-cross-join-and-putting-a-comma-between-th by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 시퀀스 만 행을 SQL 기 (0) | 2020.04.11 |
---|---|
[SQL] 어떻게 커서를 사용하지 않고 SQL의 실행 합계를 계산합니까? (0) | 2020.04.11 |
[SQL] SQL Server의 두 날짜 사이의 모든 날짜를 가져옵니다 (0) | 2020.04.11 |
[SQL] SQL에서 어떻게 각 그룹의 상위 2 행을 선택합니다 (0) | 2020.04.11 |
[SQL] 점검 제한 조건에 하위 쿼리 (0) | 2020.04.11 |