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 )
;
조금 늦었지만 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
'programing' 카테고리의 다른 글
Wordpress: WHY 루프에서 current_post 인덱스 번호를 가져옵니다. (0) | 2023.02.25 |
---|---|
반응 JS 오류: 정의되지 않은 반응/jsx-no-def (0) | 2023.02.20 |
통합 테스트에서 MockMvc와 RestTemplate의 차이점 (0) | 2023.02.20 |
json_encode(): 인수의 UTF-8 시퀀스가 잘못되었습니다. (0) | 2023.02.20 |
각도 - UI 라우터가 이전 상태를 가져옵니다. (0) | 2023.02.20 |