복붙노트

[SQL] 크로스 조인을 사용하여 두 테이블 사이에 쉼표를 넣어의 차이점은 무엇입니까?

SQL

크로스 조인을 사용하여 두 테이블 사이에 쉼표를 넣어의 차이점은 무엇입니까?

차이 사이는 무엇인가

select * from A, B

select * from A cross join B

? 그들은 같은 결과를 반환하는 것.

두 번째 버전은 처음보다 선호되어 있습니까? 첫 번째 버전은 완전히 구문 잘못인가?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.그들은 동일하고 (거의) 사용해서는 안됩니다.

    그들은 동일하고 (거의) 사용해서는 안됩니다.

  4. ==============================

    4.첫 번째 버전은 원래 두 개의 테이블을 조인 할 수있는 유일한 방법이었다. (가) 키워드는 ANSI-92 표준에서 추가되었다 가입하기 때문에 그러나 그것은 문제의 번호가 있습니다. 그들은 같은 결과를 얻을 수 있지만, 두 번째는 더 명시하고 선호된다.

    첫 번째 버전은 원래 두 개의 테이블을 조인 할 수있는 유일한 방법이었다. (가) 키워드는 ANSI-92 표준에서 추가되었다 가입하기 때문에 그러나 그것은 문제의 번호가 있습니다. 그들은 같은 결과를 얻을 수 있지만, 두 번째는 더 명시하고 선호된다.

  5. ==============================

    5.이러한 암시 적 및 명시 적 크로스 조인의 예입니다. http://en.wikipedia.org/wiki/Join_%28SQL%29#Cross_join를 참조하십시오.

    이러한 암시 적 및 명시 적 크로스 조인의 예입니다. http://en.wikipedia.org/wiki/Join_%28SQL%29#Cross_join를 참조하십시오.

  6. ==============================

    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. ==============================

    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. ==============================

    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;
    

    더 이상 프로그래머의 의도에 대해 의심의 여지가.

    오래된 쉼표로 구분 된 구문은 좋은 이유가 대체 더 이상 사용할 수 없습니다.

  9. 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