programing

SQL에서 값 목록을 테이블 행과 결합

lastmemo 2023. 2. 20. 23:54
반응형

SQL에서 값 목록을 테이블 행과 결합

다음과 같은 값 목록이 있다고 가정합니다.1, 2, 3, 4, 5이러한 값 중 일부가 일부 열에 있는 표입니다.다음은 예를 제시하겠습니다.

id  name
 1  Alice
 3  Cindy
 5  Elmore
 6  Felix

작성하려고 합니다.SELECT리스트의 모든 값뿐만 아니라 값과 일치하는 행의 정보를 포함하는 스테이트먼트(예:LEFT OUTER JOIN내 리스트와 테이블 사이에 있기 때문에 결과는 다음과 같습니다.

id  name
 1  Alice
 2  (null)
 3  Cindy
 4  (null)
 5  Elmore

임시 테이블을 만들거나 여러 개의 임시 테이블을 사용하지 않고 이 작업을 수행하려면 어떻게 해야 합니까?UNION오퍼레이터?

Microsoft SQL Server 2008 이후인 경우 테이블 값 생성자를 사용할 수 있습니다.

 Select v.valueId, m.name 
 From (values (1), (2), (3), (4), (5)) v(valueId)
     left Join otherTable m
        on m.id = v.valueId

Postgres에는 다음과 같은 구성 값 목록도 있습니다.

SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three')) AS t (num,letter)

또한 Join에 편리한 Common Table Expression 구문도 참조해 주십시오.

WITH my_values(num, str) AS (
    VALUES (1, 'one'), (2, 'two'), (3, 'three')
)
SELECT num, txt FROM my_values

Oracle을 사용하면 가능하지만 ASK TOM에서는 더 무겁습니다.

with id_list as (
  select 10 id from dual union all
  select 20 id from dual union all
  select 25 id from dual union all
  select 70 id from dual union all
  select 90 id from dual
)
  select * from id_list;

소스에서 Oracle을 위한 다음과 같은 솔루션을 채택했습니다.기본적인 아이디어는 Oracle의 계층형 쿼리를 이용하는 것입니다.목록의 최대 길이를 지정해야 합니다(아래 샘플 쿼리에서 100).

   select d.lstid
        , t.name
     from (
               select substr(
                           csv
                         , instr(csv,',',1,lev) + 1
                         , instr(csv,',',1,lev+1 )-instr(csv,',',1,lev)-1
                      )  lstid
                 from (select ','||'1,2,3,4,5'||',' csv from dual)
                    , (select level lev from dual connect by level <= 100)
                where lev <= length(csv)-length(replace(csv,','))-1         
          ) d
left join test  t on ( d.lstid = t.id )
        ;

SQL 바이올린을 확인해 보세요.

조금 늦었지만 Oracle의 경우 다음과 같은 방법으로 가치표를 얻을 수 있습니다.

SELECT rownum + 5 /*start*/ - 1 as myval
FROM dual
CONNECT BY LEVEL <= 100 /*end*/ - 5 /*start*/ + 1

...그리고 테이블로 옮겨주세요.

SELECT *
FROM
(SELECT rownum + 1 /*start*/ - 1 myval
FROM dual
CONNECT BY LEVEL <= 5 /*end*/ - 1 /*start*/ + 1) mypseudotable
left outer join myothertable
    on mypseudotable.myval = myothertable.correspondingval

myTable이 테이블 이름이라고 가정하면 다음 코드가 작동합니다.

;with x as 
(
  select top (select max(id) from [myTable]) number from [master]..spt_values
),
y as
(select row_number() over (order by x.number) as id
from x)
select y.id,  t.name
from y left join myTable as t
on y.id = t.id;

주의:SQL Server 구현입니다.

만지작거리다

출력의 일부에 필요한 일련 번호를 가져오는 경우(이 방법을 사용하면 n개의 번호에 입력할 값이 제거됩니다).

declare @site as int
set @site = 1
while @site<=200
begin
insert into ##table
values (@site)

set @site=@site+1
end

최종 출력[위 단계 후]:

select * from ##table
select v.id,m.name from  ##table  as v
left outer join [source_table] m
 on m.id=v.id

표에 값이 있다고 가정합니다.1,2,3,4,5이름이 붙여졌다list_of_values일부 값이 포함되어 있지만 name 컬럼이 다음과 같이 되어 있는 테이블을 가정합니다.some_values, 다음을 수행할 수 있습니다.

SELECT B.id,A.name
FROM [list_of_values] AS B
LEFT JOIN [some_values] AS A
ON B.ID = A.ID

언급URL : https://stackoverflow.com/questions/23377098/joining-a-list-of-values-with-table-rows-in-sql

반응형