programing

오라클 - 쿼리에 사용할 임시 결과 집합 만들기

iphone6s 2023. 7. 1. 08:08
반응형

오라클 - 쿼리에 사용할 임시 결과 집합 만들기

테이블을 만들고 데이터를 삽입하지 않고 SQL에서 사용할 임시 결과 집합을 만들려면 어떻게 해야 합니까?

예:예를 들어 10개의 코드 목록이 있습니다.이것을 쿼리에 넣은 다음 데이터베이스를 쿼리하여 이 임시 목록에 있는 코드가 테이블에 없는지 확인합니다.

이미 테이블에 있는 경우 다음과 같은 작업을 수행할 수 있습니다.

SELECT
  ITEM_CODE
FROM
  TEMP_ITEMS
MINUS
SELECT
   ITEM_CODE
FROM
   M_ITEMS

쿼리하기 전에 PL/SQL과 순수 SQL을 사용하여 임시 행 집합을 만들지 않는 방법이 있습니까?다음과 같은 것으로 대답하지 마십시오.

SELECT 1 FROM DUAL
UNION ALL
SELECT 2 FROM DUAL

제 코드를 IN 문에 제공할 수 있는 것을 생각하고 있는데, 나중에 쿼리에 사용할 행으로 변환됩니다.

편집: 모두가 제 목표를 알고 있습니다. 기본적으로 목록에 있는 제품 코드 목록이 시스템에 설정되지 않은 것을 찾아야 합니다.데이터를 가져오는 대신 시스템에 없는 SQL 문을 확인할 수 있는 빠른 방법이 필요합니다.저는 보통 이것들을 엑셀에 넣고 다음과 같은 공식을 만듭니다.

="'"&A1&"',"

쉼표로 구분된 목록을 만들 수 있습니다.

오라클 11g를 사용하는 경우 이 작업을 수행할 수 있습니다.

with t as 
(
 select (column_value).getnumberval() Codes from xmltable('1,2,3,4,5')
)
SELECT * FROM t
WHERE NOT EXISTS (SELECT 1 FROM M_ITEMS M WHERE codes = M.ITEM_CODE);

또는

with t as 
(
 select (column_value).getstringval() Codes from xmltable('"A","B","C"')
)
SELECT * FROM t
WHERE NOT EXISTS (SELECT 1 FROM M_ITEMS M WHERE codes = M.ITEM_CODE);

저는 다음과 같이 할 것입니다.

with t as (
    select 1 as val from dual union all
    select 2 as val from dual
)
select . . .

그런 다음 후속 쿼리 블록에서 "t" 또는 "t"를 사용합니다.

select method를 사용하는 것에 대한 이의가 무엇인지 잘 모르겠습니다. . . 원하는 값을 Excel의 열에 넣고 수식을 복사하여 각 값에 대한 코드를 생성하십시오.그런 다음 결과를 쿼리 인터페이스에 다시 붙여넣습니다.

임시 테이블을 사용하려는 경우 values 절을 사용할 수 있습니다.또는 IN 기능만 사용하려는 경우 문자열 기능을 사용할 수 있습니다.쉼표로 구분된 목록에 값을 넣고 특정 값과 일치하는지 확인합니다.

where ','||<list>||',' like '%,'||col||',%'

이것은 조합이 아니기 때문에 흥미롭고 단일 선택에 적합합니다.구분 기호('a/b/c/def')를 사용하여 문자열을 두 번 입력해야 합니다.

SELECT regexp_substr('a/b/c/def', '[^/]+', 1, ROWNUM) var,
regexp_substr('2/432/sd/fsd', '[^/]+', 1, ROWNUM) var2
FROM dual
CONNECT BY LEVEL <= length(regexp_replace('a/b/c/def', '[^/]', '')) + 1;

var var2
=== ====
a   2
b   432
c   sd
def fsd

참고: 크레딧은 https://stackoverflow.com/a/1381495/463056 으로 이동합니다.

따라서 with 절을 사용하면 다음과 같은 것을 얻을 수 있습니다.

with tempo as (
SELECT regexp_substr('a/b/c/def', '[^/]+', 1, ROWNUM) var,
regexp_substr('2/432/sd/fsd', '[^/]+', 1, ROWNUM) var2
FROM dual
CONNECT BY LEVEL <= length(regexp_replace('a/b/c/def', '[^/]', '')) + 1
)
select ...

또는 from 절에서 사용할 수 있습니다.

select ...
from (
SELECT regexp_substr('a/b/c/def', '[^/]+', 1, ROWNUM) var,
regexp_substr('2/432/sd/fsd', '[^/]+', 1, ROWNUM) var2
FROM dual
CONNECT BY LEVEL <= length(regexp_replace('a/b/c/def', '[^/]', '')) + 1
) tempo

두 가지 접근 방식을 선택할 수 있습니다.

전역 임시 테이블

테이블을 만들고 싶지 않다고 해도 테이블을 원하지 않는 이유에 따라 다릅니다.Global Temporary 테이블을 만들기로 선택한 경우, 행은 해당 행을 삽입한 세션에만 표시되므로 전용 메모리 테이블을 사용하는 것과 같으나 실제 테이블에 쿼리하고 참여할 수 있는 등의 모든 이점을 제공합니다.

파이프라인 함수

다음을 사용하여 쿼리할 수 있는 형식으로 결과를 반환하는 함수를 만들 수 있습니다.TABLE()교환입니다.자세한 내용은 http://www.oracle-base.com/articles/misc/pipelined-table-functions.php 에서 확인할 수 있습니다.

약간 야해요.그러나 10g 이상을 사용한다고 가정하면 정규식을 사용하여 문자열을 별도의 행으로 구문 분석할 수 있습니다.예를들면

SQL> ed
Wrote file afiedt.buf

  1   SELECT REGEXP_SUBSTR('a,b,c,def,g', '[^ |,]+', 1, LEVEL) parsed_str
  2     FROM dual
  3* CONNECT BY LEVEL <= REGEXP_COUNT('a,b,c,def,g', '[^ |,]+')
SQL> /

PARSED_STR
--------------------------------------------
a
b
c
def
g

개인적으로, 저는 파이프라인 테이블 함수나 컬렉션을 생성하는 PL/SQL 블록을 더 쉽게 찾을 수 있지만, 만약 당신이 SQL에서 그것을 해야 한다면 당신은 그것을 할 수 있습니다.

편집한 내용에 따르면 이미 파일에 있는 제품 코드 목록을 가져오는 경우 외부 테이블을 사용하여 파일을 테이블로 노출하거나 SQL*Loader를 사용하여 데이터를 쿼리할 수 있는 테이블(임시 또는 영구)에 로드하는 것이 더 합리적인 것 같습니다.이러한 옵션 중 하나를 제외하고, 만약 당신이 엑셀의 목록을 먼저 조작하고 싶다면, 그것을 생성하는 것이 더 타당할 것입니다.INExcel에 목록을 표시하고 복사하여 쿼리에 붙여넣습니다.SQL의 구성 요소로 해당 목록을 구문 분석하기 위해 Excel에서 쉼표로 구분된 코드 목록을 생성하는 것은 너무 많은 단계로 보입니다.

언급URL : https://stackoverflow.com/questions/12169842/oracle-create-a-temporary-resultset-for-use-in-a-query

반응형