table name_table
id | name |
1 | aaa |
2 | aaa |
3 | bbb |
table info_table
id | type |
1 | type1 |
2 | type1 |
3 | type3 |
이런 테이블이 있다고 치면...
궁극적인 목표는 name_table에서 id가 다른데 name이 같고 보여줄때는 type까지 같이 보여주고 싶어서 쿼리를 짜봤는데
select nt1.name, nt1.id, nt2.id, type
from name_table as nt1, name_table as nt2
left join info_table
on nt1.id = name_table.id
where nt1.id != nt2.id and nt1.name= nt2.name
이런식으로 짜면 에러 발생하는데... 어떻게 짜야 될까요 ㅠㅠ
sql 초보라 질문드립니다.
SQL Error [42P01]: ERROR: invalid reference to FROM-clause entry for table "nt1"
Hint: There is an entry for table "nt1", but it cannot be referenced from this part of the query.
Position: 105
Comment 3
-
건우아빠
2019.12.20 20:54
-
우꾸무꾸
2019.12.23 18:13
안녕하세요.
이렇게 어렵게 짜야되나요 ㅠㅠ
구글링해보니 collect_list라는것도 있는거 같은데
https://jaeyung1001.tistory.com/57
이게 제가 딱 원하던 그림인데 제껀 PostgreSQL인데 저는 에러가 나더라구요 ㅠㅠ cast해야된다고
SQL Error [42883]: ERROR: function collect_list(bigint) does not exist
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Position: 15
postgresSQL에서는 collect_list 같은걸 원래 못쓰는건지..
-
건우아빠
2019.12.23 22:06
디비 마다 특성있는 함수가 있는데 postgresSQL 에서는 없는것 같네여...링크 거신 내용하고 질문 하신 내용은 조금 다른 내용인듯 한데...사용자 함수 만드 신 다음 이용하시면 될것 같은데요,,, 없으면 만들어 쓰시면 될듯 합니다 .
with name_table
as (
select 1 id ,'aaa' name union all
select 2 ,'aaa' union all
select 3 ,'bbb' ) ,
info_table as
(
select 1 id ,'type1' type union all
select 2 ,'type1' union all
select 3 ,'type3' ),
res as
(
select name , COUNT(*) cnt
from name_table
group by name )
select b.id , b.name , case when a.cnt = 1 then '' else c.type end type , a.cnt
from res a join name_table b on a.name = b.name
outer apply
(
select *
from info_table
where id = b.id
) c