문제

십자가 참여 수행하는 데카르트 제품에서 튜플의 두 개의 설정합니다.

SELECT *
FROM Table1
CROSS JOIN Table2

어떤 상황에서 렌더링 이러한 SQL 작업에 특히 유용합니까?

도움이 되었습니까?

해결책

특정 의류 기사에 대한 크기 및 색상 정보와 같이 완전히 채우고 싶은 "그리드"가있는 경우 :

select 
    size,
    color
from
    sizes CROSS JOIN colors

어쩌면 하루에 매 순간 행이 포함 된 테이블을 원하고이를 사용하여마다 절차가 1 분마다 실행되었는지 확인하려고하므로 세 개의 테이블을 교차 할 수 있습니다.

select
    hour,
    minute
from
    hours CROSS JOIN minutes

또는 연중 매달 신청하려는 표준 보고서 사양 세트가 있습니다.

select
    specId,
    month
from
    reports CROSS JOIN months

이것을 견해로 유지하는 데있어 문제는 대부분의 경우, 특히 옷과 관련하여 완전한 제품을 원하지 않는다는 것입니다. 추가 할 수 있습니다 MINUS 쿼리에 대한 논리가 가지고 있지 않은 특정 조합을 제거하려면 다른 방법으로 테이블을 채우고 데카르트 제품을 사용하지 않는 것이 더 쉽다는 것을 알 수 있습니다.

또한, 당신은 당신이 생각했던 것보다 몇 줄이 더 많은 테이블에서 크로스 조인을 시도하게 될 수도 있습니다. WHERE 절은 부분적으로 또는 완전히 누락되었습니다. 이 경우 DBA가 누락을 신속하게 알려줍니다. 보통 그 또는 그녀는 행복하지 않을 것입니다.

다른 팁

일반적으로 대부분의 데이터베이스 쿼리에 대한 전체 직교 제품을 원하지 않을 것입니다. 관계형 데이터베이스의 전체 힘은 DB에서 불필요한 행을 당기지 않도록 관심이있는 모든 제한을 적용 할 수 있다는 것입니다.

직원의 테이블이 있고 한 직원의 한 직원의 모든 과제를 한 직무에보고 싶어하는 일자리 테이블이있는 경우 원하는 예를 들었습니다.

테스트를위한 데이터를 생성합니다.

좋아, 이것은 아마도 질문에 대답하지 않을 것이지만, 그것이 사실이라면 (그리고 나는 그것을 확실하지 않다면) 재미있는 역사입니다.

Oracle의 초기 시절, 개발자 중 한 명이 테이블의 모든 행을 복제해야한다는 것을 깨달았습니다 (예 : 이벤트 테이블 일 수 있으며 별도의 "시작 이벤트"및 "END 이벤트"를 변경해야했습니다. 항목). 그는 단지 두 줄의 테이블을 가지고 있다면, 크로스 조인을 할 수 있고 첫 번째 테이블의 열만 선택하고 정확히 필요한 것을 얻을 수 있다는 것을 깨달았습니다. 그래서 그는 간단한 테이블을 만들었고, 그는 자연스럽게 "듀얼"이라고 불렀습니다.

나중에, 그는 행동 자체가 테이블과 관련이 없지만 테이블에서 선택을 통해서만 할 수있는 일을해야합니다. .) 그는 여전히 자신의 듀얼 테이블이 누워 있다는 것을 깨달았고 그것을 사용했습니다. 잠시 후, 그는 시간이 두 번 인쇄되는 것을 보는 데 지쳤으므로 최종 행 중 하나를 삭제했습니다.

Oracle의 다른 사람들은 그의 테이블을 사용하기 시작했으며 결국 표준 Oracle 설치에 포함시키기로 결정했습니다.

이는 하나의 행에 한 행에 "Two"를 의미하는 이름을 가지고 있다는 점이 유일한 테이블을 설명합니다.

열쇠는 "가능한 모든 조합을 보여주세요"입니다. 나는 이것을 다른 계산 된 필드와 함께 정렬/필터링 한 것과 함께 사용했습니다.

예를 들어, 차익 거래 (거래) 응용 프로그램을 구축한다고 가정 해보십시오. 가격으로 제품을 제공하는 판매자와 구매자가 비용으로 제품을 요구하는 구매자가 있습니다. 제품 키에 대한 크로스 조인 (잠재적 구매자와 판매자와 일치시키기 위해), 비용과 가격 사이의 스프레드를 계산 한 다음 DESC를 정렬합니다. 이것에 대해 (중개인) 가장 수익성있는 거래를 실행할 수 있습니다. 거의 항상 다른 경계 필터 기준을 가질 것입니다.

숫자 0-9에 대해 10 행이있는 숫자 테이블과 같은 것을 취합니다. 해당 테이블의 크로스 조인을 몇 번 사용할 수 있지만 결과는 적절하게 번호가 매겨져있는 많은 행이있는 결과를 얻을 수 있습니다. 이것은 많은 용도가 있습니다. 예를 들어, DatADD () 함수와 결합하여 주어진 연도에 매일 세트를 얻을 수 있습니다.

이것은 크로스 조인을 사용하는 흥미로운 방법입니다. Crosstab 보고서를 작성하십시오. 나는 그것을 발견했다 Joe Celko의 스마트를위한 SQL, 여러 번 사용했습니다. 약간의 설정이 필요하지만 투자 시간의 가치가있었습니다.

상상 당신의 시리즈를 쿼리할 문제는 특정 항목들의 조합하고 날짜를(가격,가용성,등..).할 수 있습 로드 항목을 날짜로 별도의 임시 테이블과 당신의 쿼리가 십자가에 참여 테이블이 있습니다.이 것이 더 편리 할 수 있습의 대안보다 열거하는 항목은 날짜에서 절기 때문에 특히 어떤 데이터베이스의 개수를 제한한 요소에 절이 있습니다.

당신은 그것을 사용할 수 있습니다 크로스 조인 to : - 테스트 목적으로 데이터 생성 - 모든 특성 결합 - 예를 들어 혈액 그룹 (A, B, ..)과 RH -/+등의 모든 조합이 필요합니다 ...-당신의 목적을 위해 그것을 조정하십시오;) -나는이 분야의 전문가가 아닙니다;)

CREATE TABLE "HR"."BL_GRP_01" 
("GR_1" VARCHAR2(5 BYTE));
REM INSERTING into BL_GRP_01
SET DEFINE OFF;
Insert into BL_GRP_02 (GR_1) values ('A');
Insert into BL_GRP_02 (GR_1) values ('B');
Insert into BL_GRP_02 (GR_1) values ('O');
Insert into BL_GRP_01 (GR_1) values (NULL);

CREATE TABLE "HR"."BL_GRP_02" 
("GR_1" VARCHAR2(5 BYTE));

REM INSERTING into BL_GRP_02
SET DEFINE OFF;
Insert into BL_GRP_02 (GR_1) values ('A');
Insert into BL_GRP_02 (GR_1) values ('B');
Insert into BL_GRP_02 (GR_1) values ('O');
Insert into BL_GRP_02 (GR_1) values (NULL);

CREATE TABLE "HR"."RH_VAL_01" 
("RH_VAL" VARCHAR2(5 BYTE));
REM INSERTING into RH_VAL_01
SET DEFINE OFF;
Insert into RH_VAL_01 (RH_VAL) values ('+');
Insert into RH_VAL_01 (RH_VAL) values ('-');
Insert into RH_VAL_01 (RH_VAL) values (NULL);

select distinct  a.GR_1 || b.GR_1 || c.RH_VAL as BL_GRP
from BL_GRP_01 a, BL_GRP_02 b, RH_VAL_01 c
GROUP BY a.GR_1, b.GR_1, c.RH_VAL;
  • 공통 ID가없는 2 개의 테이블에 대한 조인을 작성한 다음 Max () 등을 사용하여 그룹화하여 가능한 가장 높은 조합을 찾으십시오.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top