vannaover
60
2021-07-25 16:34:54 작성 2021-07-25 17:00:40 수정됨
4
170

아직 초보자라 잘 모릅니다. 가능하면 자세히 부탁드리겠습니다. db관련 질문입니다.


직접 db화면을 올릴 수가 없어서 급한 대로 인터넷 상의 db 사진을 포함시키겠습니다. 죄송합니다. 

위와 같은 결과를 끌어다가 데이터 검색 시 해당 데이터의 하위 항목으로 이어지는 검색 기능을 구현하려고 합니다.  (과정은 위와 같이 first-name=> last-name 같이 오른쪽에 있는 칼럼들로 이어지게.)

어떻게 db를 끌어와야만 출력 시에 다른 컬럼의 데이터는 그대로 놔주고, first-name에서만 중복되는 값이 출력되지 않게 할 수 있을까요?

 



0
  • 답변 4

  • 카카오콘
    687
    2021-07-25 16:55:33 작성 2021-07-25 17:05:16 수정됨


    질문의 요지가 조금 모호하네요. 

    first_name이 중복되는 내용때문에 어떤 문제가 발생하는지 << 이걸 말씀 안해주셨네요. 

    (그냥 막혔다고만 하시면 뭐가 막혔다는건지 알 수 없습니다.)


    다만 보편적인 내용으로, 여러 데이터를 가져와서 "하나의 로우"에 해당하는 데이터를 가지고

    추가적인 작업을 한다면

    보통 유니크값인 ID를 기반으로 where절을 사용하는 편입니다.


    ===


    수정해주셨네요.

    굳이 first_name을 가지고 다시 last_name을 ... 조회하는 쿼리를 구현할 필요가 있을까는 모르겠는데,


    어찌되었든 where 조회하려는 중복이 있는 컬럼 and ID

    로 유니크값을 같이 and절로 묶어 조회하시면 됩니다.


    만약 좀 더 심화되어, 지금은 한 테이블에 있지만

    사실 last_name은 다른 테이블에 있습니다. 

    라고 한다면 해당 두번째 테이블에도 서로 관계를 맺기 위한 

    첫번째 (사진상)테이블 의 ID값을 가지는 컬럼을 미리 만들어두어 같이 포함시켰어야 합니다.

  • vannaover
    60
    2021-07-25 17:14:28

    감사합니다. 최종적으로 노렸던 것은 db에서 select 값을 출력 시, 컬럼별로 중복 값을 제거한

    (distinct 같이 100% 동일한 검색 조건을 제거하는 게 아니라)  sql 구문을 작성해보는거였는데..

    생각해보니 가능할 리가 없었군요.. 아예 생각을 돌려서 하나의 sql에서 전부 해결하지 말고, 연속적으로 검색을 이어나가는 sql을 추가적으로 작성해야 할 필요가 있을 것 같습니다.



  • 카카오콘
    687
    2021-07-25 17:34:38 작성 2021-07-25 17:35:43 수정됨


    아.. 뭘 하시려고 하는지 이제서 이해가 된듯 합니다. 물론.. 가능하진 않습니다.

    사실상 이름컬럼1개만 보이고 옆에는 3개,4개씩 컬럼이 붙어다니는 형국이니..


    그나마 차선책이라면 group by로 묶어버리고, 중복이 아닌 컬럼은 

    컬럼데이터를 구분자로 이어서 하나의 컬럼으로 모아주는 코드를 쓴 다음

    (즉 결과가 이렇게 나옵니다.)

    FIRST_NAME  | row_num

       Janine          |     2,3,4


    리턴받는곳에서 구분자로 구분해서 list에 담아 쓰는 방법은 있습니다.

  • 북극펭귄
    18
    2021-07-25 17:37:54 작성 2021-07-25 17:56:13 수정됨

    질문의 요지를 잘 이해 못해서 명확한 답변을 드리기는 어려우나, For-Loop을 통해 SQL을 실행하는건 대단히 비효율적인 방식입니다.


    두 컬럼의 값을 합한 것을 검색하려면 컬럼1||컬럼2 와같이 concat 후 검색할 수 있습니다.

    이후 필터링된 결과 이후 중복제거 하시면 됩니다.


    만약 단순히 프로그램상에서 first_name은 하나이고 나머지는 List 형식으로 받고 싶다면, Java 기준으로 위 결과를 그대로 전달받은 다음 프로그램상에서 groupBy 처리하는것은 어떨까 싶습니다.


    ex)

    리턴list.stream().collect(Colletors.groupingBy(dto -> dto.firstName))

  • 로그인을 하시면 답변을 등록할 수 있습니다.