쿼리 결과를 병합합니다. 쿼리 결과 결합 쿼리를 하나의 1로 결합하는 방법

쿼리 언어는 개발자를 위한 1C 8.3의 기본 메커니즘 중 하나입니다. 쿼리를 사용하면 데이터베이스에 저장된 모든 데이터를 빠르게 가져올 수 있습니다. 구문은 SQL과 매우 유사하지만 몇 가지 차이점이 있습니다.

SQL에 비해 1C 8.3(8.2) 쿼리 언어의 주요 장점:

  • 역참조 참조 필드(하나 이상의 점을 개체 속성으로 전환)
  • 결과 작업이 매우 편리합니다.
  • 가상 테이블 생성 기능;
  • 요청은 영어와 러시아어로 작성될 수 있습니다.
  • 교착 상태를 피하기 위해 데이터를 차단하는 기능.

1C에서 쿼리 언어의 단점:

  • SQL과 달리 1C 쿼리에서는 데이터를 변경할 수 없습니다.
  • 저장 프로시저 부족;
  • 문자열을 숫자로 변환할 수 없음.

1C 쿼리 언어의 기본 구성에 대한 미니 자습서를 고려하십시오.

1C의 요청은 데이터 수신만 허용하므로 모든 요청은 "SELECT"라는 단어로 시작해야 합니다. 이 명령 뒤에 데이터를 가져오려는 필드가 표시됩니다. "*"를 지정하면 사용 가능한 모든 필드가 선택됩니다. 데이터가 선택되는 위치(문서, 레지스터, 디렉토리 등)는 "FROM"이라는 단어 뒤에 표시됩니다.

아래 예에서 전체 명명법의 이름은 "명명법" 참고 서적에서 선택됩니다. "HOW"라는 단어 뒤에 테이블 및 필드의 별칭(이름)이 표시됩니다.

선택하다
Nomenclature.Name AS NameNomenclature
에서
디렉토리 명명법 AS 명명법

"SELECT" 명령 옆에 키워드를 지정할 수 있습니다.

  • 다양한. 쿼리는 적어도 하나의 필드가 다른 행만 선택합니다(중복 없음).
  • 첫 n, 어디 N– 선택할 결과의 시작부터 행 수. 대부분의 경우 이 구조는 정렬(ORDER BY)과 함께 사용됩니다. 예를 들어 최신 문서를 날짜별로 특정 개수만큼 선택해야 하는 경우입니다.
  • 허용된. 이 디자인을 사용하면 현재 사용자가 사용할 수 있는 레코드만 데이터베이스에서 선택할 수 있습니다. 이 키워드를 사용하면 액세스 권한이 없는 레코드를 쿼리하려고 하면 사용자에게 오류 메시지가 표시됩니다.

이러한 키워드는 함께 또는 개별적으로 사용할 수 있습니다.

변화를 위해

이 절은 충돌을 피하기 위해 데이터를 잠급니다. 잠긴 데이터는 트랜잭션이 끝날 때까지 다른 연결에서 읽지 않습니다. 이 절에서 잠그려는 특정 테이블을 지정할 수 있습니다. 그렇지 않으면 모두 차단됩니다. 디자인은 자동 차단 모드에만 관련됩니다.

대부분의 경우 "FOR CHANGE" 절은 잔액을 받을 때 사용됩니다. 실제로 여러 사용자가 동시에 프로그램에서 작업할 때 한 사람이 잔액을 받는 동안 다른 사용자는 잔액을 변경할 수 있습니다. 이 경우 결과 잔액이 더 이상 정확하지 않습니다. 이 제안으로 데이터를 차단하면 첫 번째 직원이 올바른 잔액을 받고 필요한 모든 조작을 수행할 때까지 두 번째 직원은 기다려야 합니다.

선택하다
상호 합의 직원,
상호 정산 금액 상호 정산 잔액
에서
누적 등록 직원과의 상호 정산 상호 정산으로 잔액
변화를 위해

어디

언로드된 데이터에 대한 선택을 부과하려면 구성이 필요합니다. 레지스터에서 데이터를 얻는 경우에는 가상 테이블의 매개 변수에서 선택 조건을 규정하는 것이 더 합리적입니다. "WHERE"를 사용할 때 모든 레코드를 먼저 가져온 다음 선택만 적용하므로 쿼리 속도가 크게 느려집니다.

다음은 특정 직위를 가진 담당자를 구하라는 요청의 예입니다. 선택 매개변수의 형식은 &ParameterName(매개변수 이름은 임의임)입니다.

선택(케이스)

구성을 사용하면 요청 본문에서 직접 조건을 지정할 수 있습니다.

아래 예에서 "AdditionalField"에는 문서 게시 여부에 따라 텍스트가 포함됩니다.

선택하다
입장T&U.Link,
선택
언제
그런 다음 "문서가 게시되었습니다!"
ELSE "문서가 게시되지 않았습니다..."
END AS 추가 필드
에서
Document.Receipt of GoodsServices AS ReceiptT&C

가입하다

조인은 특정 연결 조건으로 두 테이블을 연결합니다.

왼쪽/오른쪽 조인

LEFT 조인의 본질은 첫 번째 지정된 테이블을 완전히 가져오고 두 번째 테이블은 연결 조건에 따라 연결된다는 것입니다. 두 번째 테이블에 첫 번째 테이블에 해당하는 레코드가 없으면 해당 값으로 NULL이 대체됩니다. 간단히 말해 기본 테이블은 첫 번째 지정된 테이블이고 두 ​​번째 테이블(있는 경우)의 데이터는 이미 해당 데이터로 대체됩니다.

예를 들어, "상품 및 서비스 수령" 문서에서 항목 항목을 가져오고 정보 레지스터 "항목 가격"에서 가격을 가져와야 합니다. 이 경우 어떤 포지션의 가격도 찾을 수 없으면 NULL로 대체합니다. 가격이 있는지 여부에 관계없이 문서의 모든 항목이 선택됩니다.

선택하다
T&U 명명법,
가격.가격
에서
Document.GoodsServices.Goods AS ReceiptT&C의 수령
내부 조인
ON Q&A.Nomenclature 접수 = 가격.Nomenclature

RIGHT에서는 모든 것이 정반대입니다.

완전한 연결

이 유형의 조인은 첫 번째 테이블과 두 번째 테이블의 모든 레코드가 결과로 반환된다는 점에서 이전 조인과 다릅니다. 지정된 연결 조건에 대해 첫 번째 또는 두 번째 테이블에서 레코드를 찾을 수 없으면 대신 NULL이 반환됩니다.

이전 예에서 전체 조인을 사용하는 경우 상품 및 서비스 영수증 문서의 모든 항목 항목과 항목 가격 레지스터의 모든 최신 가격이 선택됩니다. 첫 번째 테이블과 두 번째 테이블 모두에서 찾을 수 없는 레코드의 값은 NULL이 됩니다.

내부 조인

INNER 조인과 FULL 조인의 차이점은 하나 이상의 테이블에서 레코드를 찾을 수 없는 경우 쿼리에서 해당 레코드를 전혀 표시하지 않는다는 것입니다. 결과적으로 이전 예에서 FULL을 INTERNAL로 바꾸면 상품 및 서비스 영수증 문서의 항목 가격 정보 레지스터에 항목이 있는 항목만 선택됩니다.

그룹화 기준

1C 쿼리에서 그룹화하면 특정 공통 기능(그룹화 필드)에 따라 테이블 행(그룹화 필드)을 축소할 수 있습니다. 그룹화 필드는 집계 함수를 사용해서만 표시할 수 있습니다.

다음 쿼리의 결과는 최대 가격이 있는 항목 유형 목록입니다.

선택하다
,
MAX(가격.가격) AS가격
에서

그룹화 기준
가격.명칭.유형명칭

결과

그룹화와 달리 합계를 사용하면 모든 레코드가 표시되고 합계 행이 이미 추가되어 있습니다. 그룹화는 일반화된 레코드만 표시합니다.

전체 테이블(키워드 "GENERAL" 사용), 여러 필드, 계층 구조가 있는 필드(키워드 "HIERARCHY", "ONLY HIERARCHY")에 대한 결과를 요약할 수 있습니다. 요약할 때 집계 함수를 사용할 필요가 없습니다.

그룹화를 사용하는 위의 예와 유사한 예를 고려하십시오. 이 경우 쿼리 결과는 그룹화된 필드뿐만 아니라 자세한 레코드도 반환합니다.

선택하다
가격.명명법.명명법 유형 AS 명명법 유형,
가격.가격 그대로 가격
에서
RegisterInformation.PricesNomenclature.SliceLast AS 가격
결과
최대(가격)
에 의해
유형 명명법

갖는

이 연산자는 WHERE 연산자와 유사하지만 집계 함수에만 사용됩니다. 이 연산자가 사용하는 필드 이외의 필드는 그룹화해야 합니다. "WHERE" 연산자는 집계 함수에 적용할 수 없습니다.

아래 예에서는 항목 유형별로 그룹화된 최대 항목 가격이 1000을 초과하는 경우 선택됩니다.

선택하다

MAX(가격.가격) AS가격
에서
RegisterInformation.PricesNomenclature.SliceLast AS 가격
그룹화 기준
가격.명칭.유형명칭
갖는
MAX(가격.가격) > 1000

정렬 기준

"ORDER BY" 연산자는 쿼리 결과를 정렬합니다. 레코드가 일관된 순서로 출력되도록 하기 위해 AUTO-ORDER가 사용됩니다. 기본 유형은 일반적인 규칙에 따라 정렬됩니다. 참조 유형은 GUID별로 정렬됩니다.

이름별로 정렬된 직원 목록을 가져오는 예:

선택하다
직원.이름 AS 이름
에서
디렉터리 직원 AS 직원
정렬 기준
이름
자동 주문

1C 쿼리 언어의 다른 구조

  • 맞잡다- 하나의 두 쿼리 결과.
  • 모두 단결– JOIN과 유사하지만 동일한 행을 그룹화하지 않습니다.
  • 빈 테이블- 빈 중첩 테이블을 지정하기 위해 쿼리를 조인할 때 가끔 사용됩니다.
  • 놓다-복잡한 1C 쿼리를 최적화하기 위해 임시 테이블을 만듭니다. 이러한 요청을 일괄 요청이라고 합니다.

쿼리 언어 기능

  • 하위 문자열지정된 위치에서 지정된 문자 수만큼 문자열을 자릅니다.
  • 연도…두 번째숫자 유형의 선택된 값을 얻을 수 있습니다. 입력 매개변수는 날짜입니다.
  • 기간 시작 및 기간 종료날짜 작업을 할 때 사용합니다. 기간 유형(DAY, MONTH, YEAR 등)은 추가 매개변수로 지정됩니다.
  • 주소날짜에서 특정 유형(SECOND, MINUTE, DAY 등)의 지정된 시간을 더하거나 뺄 수 있습니다.
  • 날짜 차이출력 값의 유형(DAY, YEAR, MONTH 등)을 지정하여 두 날짜 간의 차이를 결정합니다.
  • ISNULL누락된 값을 지정된 표현식으로 바꿉니다.
  • 프리젠테이션 및 프리젠테이션링크지정된 필드의 문자열 표현을 가져옵니다. 각각 모든 값과 참조 값에만 사용됩니다.
  • 유형, 값 유형입력 매개변수의 유형을 판별하는 데 사용됩니다.
  • 링크속성 값 유형에 대한 논리적 비교 연산자입니다.
  • 표현하다값을 원하는 유형으로 변환하는 데 사용됩니다.
  • 날짜 시간숫자 값(연, 월, 일, 시, 분, 초)에서 "날짜" 유형의 값을 가져옵니다.
  • 의미 1C 요청에서 사전 정의 된 값 (디렉토리, 열거, 특성 유형 계획)을 지정하는 데 사용됩니다. 사용 예: " 여기서 LegalIndividual = 값(Enumeration.LegalIndividual.Individual)«.

쿼리 빌더

1C로 쿼리를 생성하기 위해 쿼리 디자이너라는 매우 편리한 기본 제공 메커니즘이 있습니다. 여기에는 다음과 같은 기본 탭이 포함되어 있습니다.

  • "테이블 및 필드" - 선택할 필드와 해당 소스가 포함되어 있습니다.
  • "링크" - CONNECTION 구조에 대한 조건을 설명합니다.
  • "그룹화" - 그룹화 구성에 대한 설명과 그룹별로 요약된 필드를 포함합니다.
  • "조건" - 요청에서 데이터 선택을 담당합니다.
  • "Advanced" - "SELECT" 명령의 키워드 등과 같은 추가 쿼리 매개변수
  • "Joins / Aliases" - 테이블 조인 가능성이 표시되고 별칭이 설정됩니다("HOW" 구조).
  • "주문" - 쿼리 결과 정렬을 담당합니다.
  • "총계" - "그룹화" 탭과 유사하지만 "총계" 구성에 사용됩니다.

요청 자체의 텍스트는 왼쪽 하단 모서리에 있는 "요청" 버튼을 클릭하여 볼 수 있습니다. 이 양식에서는 수동으로 수정하거나 복사할 수 있습니다.


쿼리 콘솔

"엔터프라이즈" 모드에서 쿼리 결과를 빠르게 보거나 복잡한 쿼리를 디버깅하려면 . 쿼리 텍스트가 작성되고 매개 변수가 설정되며 결과가 표시됩니다.

쿼리 콘솔은 ITS 디스크 또는 에서 다운로드할 수 있습니다.

단일 테이블로 작업하는 경우 조인을 사용할 필요가 없습니다. 예를 들어 상품 구매 및 판매에 대한 데이터를 가져와야 하는 경우와 같이 여러 테이블로 작업할 때는 완전히 다른 문제입니다.

병합할 때 사용하는 문장 맞잡다. 실제로 쿼리 결과가 결합됩니다. 즉, 각 쿼리는 서로 독립적으로 데이터를 수집한 다음 이러한 결과를 하나로 결합합니다. 그리고 마지막 쿼리에서만 순서 지정 및 합계 계산과 같은 다른 작업이 수행됩니다.

쿼리를 결합할 때 결과는 "수직으로 붙습니다". 즉, 첫 번째 쿼리의 결과 행이 먼저 나온 다음 두 번째가 나옵니다.

연습으로 넘어갑시다:
코드 1C v 8.x 선택
명명법,
수량,
합집합
에서
문서.영수증.상품

맞잡다

선택하다
명명법,
수량,
합집합
에서
문서.영수증.상품

이 쿼리의 결과는 다음과 같습니다.
명칭 수량 금액
용지 A4 25 14 500
스티커 500 l 8 4 880
파일 투명 5 4 100
사무실 세트 8 8 840

결과적으로 서로 연결될 두 개의 테이블을 얻게 됩니다. 들어오는 문서가 어디에서 끝나고 나가는 문서가 시작되는지 확인하기 어렵습니다. 그러나 우리는 그것을 이해하기 위해 무언가를 할 것입니다:
코드 1C v 8.x
선택하다
명명법,
수량 AS 수량입고,
금액 AS SumIncome,
0 HOW 수량 소비,
0 AS SUM비용
에서
문서.영수증.상품

맞잡다

선택하다
명명법,
0 AS 번호수신,
0 AS 합계 소득,
수량 AS 수량 비용,
금액 AS SumExpense
에서
문서.소모품.상품

요청 텍스트에서 볼 수 있듯이 각 문서에 대해 수량 및 금액에 대해 다른 별칭을 설정했습니다. 또한 금액과 수량의 값을받을 필드 대신 0을 입력합니다. 금액과 금액의 빈 값을 0으로 바꾸려면 필요합니다.

용지 A4 25 14 500
스티커 500 l 8 4 880
파일 투명 5 4 100
사무실 세트 8 8 840
사무실 세트 1 1 105
투명파일 1 820
스티커 500 l 1 610

이제 쿼리 결과에서 중복 요소를 제거해야 합니다. 쿼리가 두 개 있는데 중복 요소를 제외하기 위해 각각을 개별적으로 축소하면 성공하지 못합니다. 따라서 쿼리를 다음 형식으로 가져올 것입니다.
코드 1C v 8.x
선택하다
명명법,
SUM(소득수) AS 소득수,
SUM(수입) AS 수수입,
SUM(비용수) AS 금액,
SUM(SumExpense) AS SumExpense
에서

(선택하다
명명법,
수량 AS 수량입고,
금액 AS SumIncome,
0 HOW 수량 소비,
0 AS SUM비용
에서
문서.영수증.상품

맞잡다

선택하다
명명법,
0 AS 번호수신,
0 AS 합계 소득,
수량 AS 수량 비용,
금액 AS SumExpense
에서
Document.Consumable.Products) AS NestedRequest

GROUP BY 명명법

따라서 전체 쿼리가 대괄호로 묶여 있고 이름이 NestedQuery인 것을 볼 수 있습니다. 이렇게 하면 두 하위 쿼리의 레코드를 그룹화하고 중복 요소를 제거할 수 있습니다. 이러한 구성을 중첩 쿼리라고 합니다. 이 쿼리의 결과는 다음과 같습니다.
명명법 수량수입 합계수입 수량비용 합계비용
용지 A4 25 14 500
스티커 500 l 8 4 880 1 610
사무실 세트 5 4 100 1 1 105
파일 투명 8 8 840 1 820

결과적으로 중첩된 하위 쿼리의 데이터가 명확한 형식으로 축소된 그룹화된 테이블을 얻습니다. 중첩된 쿼리의 수는 255개를 초과하지 않아야 합니다. 여기서는 4개의 하위 쿼리를 사용했습니다.

그룹화를 사용하지 않고 쿼리에 고유한 레코드 값만 남기고 싶은 경우. 키워드 ALL 없이 문장 JOIN을 작성해야 합니다.

사이트에서 가져온 정보

; 하위 쿼리(개발 중).

상품 및 서비스 수령그리고 공급자에게 상품 반품지정된 기간 동안.

새 탭: 조합/별칭.

수업 번호 4의 이론적인 부분

Query Builder 1c를 사용하면 쿼리 집계를 생성할 수 있습니다. 그들의 도움으로 관계를 사용하지 않고 여러 쿼리에서 얻은 데이터를 결과로 순차적으로 출력할 수 있습니다. 조인을 위한 유일한 조건은 모든 단일 쿼리에서 동일한 필드 집합입니다.

생성자에서 탭으로 이동합니다. 공용체/별칭. 쿼리 조인을 만들고 쿼리 필드의 별칭을 설정하기 위한 것입니다. 표준 데이터베이스 필드 이름이 익숙하지 않은 경우 필드 별칭이 필요합니다. 쿼리 필드가 데이터베이스 테이블 필드로만 구성된 경우 별칭이 필요하지 않습니다. 필드를 만들 때 쿼리 언어 함수를 사용한 경우 해당 필드에 대한 별칭이 필요합니다. 이러한 필드의 경우 쿼리 빌더는 표준 별칭을 생성합니다. 필드1…필드N, 이러한 별칭은 사용자에게 편리한 것으로 바꿀 수 있습니다.

탭의 섹션 고려 조합/별칭:

  • 요청(빨간색 프레임). 이 섹션에는 결합된 모든 쿼리를 보여주는 표가 포함되어 있으며, 이 섹션 위에 있는 메뉴를 사용하여 새 쿼리를 추가하고, 기존 쿼리를 복사하고, 선택한 쿼리를 삭제하고, 교체할 수 있습니다. 쿼리를 추가하거나 복사할 때 디자이너는 탭으로 이동합니다. 테이블 및 필드, 여기서 새 쿼리에 대한 데이터베이스 테이블 및 필수 필드를 설정할 수 있습니다. 새로운 1s 요청이 추가될 때 생성자의 오른쪽에 표시되는 탭을 사용하여 요청 간에 전환할 수 있습니다.

  • 테이블 요청두 열:
    • 이름. 형식으로 자동 설정 요청 1 … 요청 N;
    • 중복 없음. 이전 쿼리와 연결할 때 중복 행을 제외해야 하는지 여부를 설정합니다. 이 플래그는 이전 요청과 함께 설정된 요청의 합집합에만 영향을 미친다는 점은 주목할 가치가 있습니다.

  • 별칭(파란색 프레임). 이 섹션에서는 쿼리 필드의 별칭을 설정하고 결합된 쿼리의 일치 필드를 설정하여 쿼리 결과에서 동일한 열에 있고 동일한 별칭 아래에 표시되도록 할 수 있습니다. 결합된 쿼리의 필드 이름이 같으면 필드 간의 대응이 자동으로 조정됩니다. 필드의 대응을 설정하려면 테이블에서 필요한 별칭이 있는 줄을 찾고 열에서 필요한 쿼리를 찾은 다음 드롭다운 목록에서 필드를 선택해야 합니다.

수업 번호 4의 실용적인 부분

수업 시작 부분에 주어진 문제의 해결책을 분석해 봅시다. 조건을 상기시켜 드리겠습니다.

작업: 게시된 모든 문서를 쿼리로 선택 상품 및 서비스 수령그리고 공급자에게 상품 반품지정된 기간 동안.

  1. 새 요청을 생성해 보겠습니다.
  2. 쿼리 빌더를 시작하겠습니다.
  3. 테이블을 선택하자 입고 서비스지점에서 선적 서류 비치;
  4. 테이블에서 입고 서비스필드를 선택 링크;
  5. 탭으로 갑시다 정황;
  6. 장에서 필드, 지점을 엽니다 입고 서비스"+" 버튼 사용;
  7. 소품을 찾아보자 날짜조건 섹션으로 드래그하고 비교 연산자를 선택합니다. 사이예를 들어 기간의 시작과 끝에 대한 매개변수를 지정합니다. 기간의 시작그리고 기간 종료;
  8. 탭으로 갑시다 조합/별칭.
  9. 새 요청, 플래그 추가 중복 없음다른 유형의 문서를 사용하기 때문에 제기할 필요가 없습니다.

  10. Query Builder 1은 자동으로 탭으로 이동합니다. 테이블 및 필드. 창 오른쪽에서 두 번째 가입 요청이 활성화된 것을 볼 수 있습니다.


  11. 테이블에 대해 1~7단계를 반복하겠습니다. 공급자에게 상품 반품;
  12. 탭으로 돌아가 봅시다. 조합/별칭. 별칭 테이블에서 필드가 링크두 테이블이 같은 줄에 있습니다. 즉, 두 문서에 대한 링크는 쿼리 결과로 같은 열에 있게 됩니다.
  13. 열 이름을 다음에서 변경 링크~에 문서(필드 별칭 설정). 이렇게 하려면 마우스 왼쪽 버튼으로 필드 이름을 두 번 클릭합니다. 그런 다음 이름을 설정할 수 있습니다. 거기에 입력하십시오. 문서;

  14. 요청이 준비되었습니다. 디자이너 창 하단의 "확인" 버튼을 클릭합니다.

결과적으로 다음 텍스트가 포함된 요청을 받게 됩니다.

하나의 쿼리에 여러 쿼리를 결합해야 하는 상황이 있으며 테이블 조인은 어떤 식으로든 도움이 되지 않습니다. 예를 들어 보여주는 것이 가장 쉽습니다.

우리 시스템에서 상품 구매 및 판매 사실이 각각 소득 및 지출 문서로 등록되어 있다고 가정해 보겠습니다. 상대방은 구매자이자 공급자가 될 수 있습니다. 부채 상쇄는 상품 인도로 이루어질 수 있습니다.

상대방의 총 부채를 계산하려면 이 상대방의 모든 비용 합계를 더하고 동일한 상대방으로부터 받은 모든 영수증의 합계를 빼야 합니다. 이를 수행하는 가장 쉬운 방법은 UNITE ALL 연산자를 사용하는 것입니다.

요청.텍스트 =
"
//상대방에게 배송한 금액을 계산합니다.
|선택
| 소비.상대방,
|에서
| 문서.비용 AS 비용
|그룹화 기준
| 소비.상대방
|모두 가입
//상대방 수 계산
//상품을 우리에게 배달했습니다.
|선택
| 도착.계약자,
// 음수 부호로 금액을 가져옵니다.
//합산 시 비용 금액에서 공제됨
| SUM(-입금.금액)
|에서
| 문서.수신 AS수신
|그룹화 기준
| 도착.계약자";

첫 번째 요청에서는 각 상대방의 비용을 계산하고 두 번째 요청에서는 각 상대방이 우리에게 상품을 인도한 금액을 계산합니다. 두 번째 쿼리의 금액은 빼기 기호로 가져오므로 결과 테이블이 접힐 때 이 상대방에게 발송되는 금액에서 차감됩니다. 결과적으로 다음 형식의 테이블을 얻습니다.

정확히 우리가 원했던 것은 아니지만 거의 비슷합니다. 원하는 결과를 얻으려면 상대방별로 그룹화해야 합니다. 이렇게 하려면 쿼리를 임시 테이블에 배치해야 합니다(임시 테이블 작업은 다음에서 설명합니다. 코스의 폐쇄된 부분 ) 필드를 선택하고 그룹화합니다.

요청 = 새 요청;
요청.텍스트 =
"선택하다
| 소비.상대방,
| AMOUNT(비용.금액) AS 부채
|PUT TU_수입 비용
|에서
| 문서.비용 AS 비용
|그룹화 기준
| 소비.상대방
|모두 가입
|선택
| 도착.계약자,
| SUM(-입금.금액)
|에서
| 문서.수신 AS수신
|그룹화 기준
| 도착.계약자
|;
|////////////////////////////////////////////////////////////////////////////////
|선택
| Tue_IncomingExpense.Counterparty,
| SUM(BT_IncomeExpense.Debt) AS 부채
|에서
| Tue_IncomeExpense AS Tue_IncomeExpense
|그룹화 기준
| Tue_IncomingExpense.Counterparty";

쿼리 병합을 위한 요구 사항

두 개의 쿼리를 결합할 때 필드 수가 동일해야 하며 쿼리에 필드가 없으면 상수로 추가해야 합니다. 위의 예를 보면 비용 문서에도 할인 필드가 있어 상대방의 부채가 줄어들지만 소득 문서에는 할인이 없다고 가정해 보겠습니다. 이 경우 어떻게 될까요? 그래서:

요청 = 새 요청;
요청.텍스트 =
"선택하다
| 소비.상대방,

|에서
| 문서.비용 AS 비용
|그룹화 기준
| 소비.상대방
|모두 가입
|선택
| 도착.계약자,
| SUM(-입금.금액),
// null 필드 할인 추가
| 0
|에서
| 문서.수신 AS수신
|그룹화 기준
| 도착.계약자";

할인과 그룹을 빼는 것이 남아 있습니다.

순서도 중요합니다. 필드는 두 쿼리의 SELECT 섹션에 지정된 순서대로 정확하게 결합됩니다. 이전 예와 관련하여 영수증 선택에서 할인 및 금액 필드를 바꾸겠습니다.

요청 = 새 요청;
요청.텍스트 =
"선택하다
| 소비.상대방,
| AMOUNT(비용.금액) AS 부채,
| SUM(비용.할인) AS할인
|에서
| 문서.비용 AS 비용
|그룹화 기준
| 소비.상대방
|모두 가입
|선택
| 도착.계약자,
//교환
| 0,
| SUM(-입금.금액)
|에서
| 문서.수신 AS수신
|그룹화 기준
| 도착.계약자";

안녕하세요, 블로그 사이트 독자 여러분. 오늘 우리는 자세히 논의 할 것입니다 1C에서 요청 결합. 카자흐스탄용 Business Management, 에디션 1.0의 일반 구성을 다운로드할 수도 있습니다.

단일 테이블로 작업하는 경우 조인을 사용할 필요가 없습니다. 예를 들어 상품 구매 및 판매에 대한 데이터를 가져와야 하는 경우와 같이 여러 테이블로 작업할 때는 완전히 다른 문제입니다.

병합할 때 사용하는 문장 유니온 / 유니온. 진짜 무슨일이야 쿼리 결과 결합즉, 각 쿼리는 서로 독립적으로 데이터를 수집한 다음 이러한 결과를 하나로 결합합니다. 그리고 마지막 쿼리에서만 순서 지정 및 합계 계산과 같은 다른 작업이 수행됩니다.

쿼리를 결합할 때와 달리 결과는 "수직으로 붙습니다". 즉, 첫 번째 쿼리의 결과 행이 먼저 나온 다음 두 번째가 나옵니다.

연습으로 넘어갑시다:

명명법, 수량, 금액 선택 맞잡다 Document.Consumable.Goods에서 명명법, 수량, 금액 선택

이 쿼리의 결과는 다음과 같습니다.

결과적으로 서로 연결될 두 개의 테이블을 얻게 됩니다. 들어오는 문서가 어디에서 끝나고 나가는 문서가 시작되는지 확인하기 어렵습니다. 그러나 우리는 그것을 알아내기 위해 무언가를 할 것입니다:

SELECT 명명법, 수량 AS 번호Prikhod, 합계 AS SumPrichod, 0 AS 수량비용, 0 AS 지출 합계 FROM Document.Incoming.Goods 맞잡다 번호Prikhod, 0 AS SumPrichod, AS 번호 수량비용, 합계 AS 지출 합계 FROM Document.Consumable.Goods

요청 텍스트에서 볼 수 있듯이 각 문서에 대해 수량 및 금액에 대해 다른 별칭을 설정했습니다. 또한 금액과 수량의 값을받을 필드 대신 0을 입력합니다. 금액과 금액의 빈 값을 0으로 바꾸려면 필요합니다.

명명법 번호Prikhod SumPrichod 수량비용 지출 합계
A4 용지 25 14 500
스티커 500리터 8 4 880
파일이 투명합니다 5 4 100
사무실 세트 8 8 840
사무실 세트 1 1 105
파일이 투명합니다 1 820
스티커 500리터 1 610

이제 쿼리 결과에서 중복 요소를 제거해야 합니다. 쿼리가 두 개 있는데 중복 요소를 제외하기 위해 각각을 개별적으로 축소하면 성공하지 못합니다. 따라서 쿼리를 다음 형식으로 가져올 것입니다.

선택하다
명명법,
SUM(소득수) AS 소득수,
SUM(수입) AS 수수입,
SUM(비용수) AS 금액,
SUM(SumExpense) AS SumExpense
에서
(
SELECT 명명법, 수량 AS 번호Prikhod, 합계 AS SumPrichod, 0 AS 수량비용, 0 AS 지출 합계 FROM Document.Incoming.Goods 맞잡다 SELECT 명명법, 0 AS 번호Prikhod, 0 AS SumPrichod, AS 번호 수량비용, 합계 AS 지출 합계 FROM Document.Consumable.Goods ) AS NestedQuery
GROUP BY 명명법

따라서 전체 쿼리가 대괄호로 묶여 있고 이름이 NestedQuery인 것을 볼 수 있습니다. 이렇게 하면 두 하위 쿼리의 레코드를 그룹화하고 중복 요소를 제거할 수 있습니다. 이러한 구조를 중첩 쿼리라고 합니다. 이 쿼리의 결과는 다음과 같습니다.

명명법 번호Prikhod SumPrichod 수량비용 지출 합계
A4 용지 25 14 500
스티커 500리터 8 4 880 1 610
사무실 세트 5 4 100 1 1 105
파일이 투명합니다 8 8 840 1 820

결과적으로 중첩된 하위 쿼리의 데이터가 명확한 형식으로 축소된 그룹화된 테이블을 얻습니다.
중첩된 쿼리의 수는 255개를 초과하지 않아야 합니다. 여기서는 4개의 하위 쿼리를 사용했습니다.