2014-02-07 3 views
0

이 쿼리를 작성하는 방법을 잘 모르거나 누군가 나를 도와 준 것처럼 친절하다고 생각했습니다.SQL Server 2012의 상관 쿼리

나는 두 테이블 (열 이름은 보안을 위해 변경되었습니다)가 :

의 MessageID 이 센더 이

carbon_copy 테이블

이 MEMBER_ID를 carbon_copy_id

을 recipientid carbon_copy_id

메시지 테이블

본질적으로 저는 카본 복사본을 허용하는 이메일 시스템을 쓰고 있습니다.

  • 회원이 한 명의 수신자에게 메시지를 보내면 carbon_copy_id가 null 인 채 하나의 레코드가 메시지 테이블에 기록됩니다.
  • 구성원이 둘 이상의받는 사람, 예를 들어 2 명의받는 사람에 대한 전자 메일을 보내는 경우 동일한 carbon_copy_id 및 각받는 사람에 대한 member_id를 사용하여 두 레코드를 탄소 복사 테이블에 삽입합니다. 그런 다음 탄소 복사 테이블에 삽입 된 공유 carbon_copy_id i가있는 메시지 테이블에 각 수신자 당 하나씩 두 개의 메시지 레코드를 삽입합니다.

    는 carbon_copy의 CC로부터 mt.messageid, mt.carbon_copy_id, 아우터 선택 ((물건을 선택 (적용 message_table MT에서 oa.member_list ','+ 캐스트 VARCHAR 등 (cc.member_id)를 선택 여기서 cc.carbon_copy_id = mt.carbon_copy_id xml 경로 (''), TYPE)에 대한 cc.member_id 의 주문 .value ('.', 'varchar (max)'), 1,2, '')) oa (member_list) messageid = id_of_message order by messageid desc

카본 카피가 null이 아닌 memberlist와 함께 하나의 레코드가 필요합니다.

그러나 위에 설명 된 패러다임이 주어지면 삽입 된 두 레코드 목록이 생성됩니다. 내가 뭘 찾고있는 결과 집합을 하나의 두 레코드를 결합하고 carbon_copied 회원 id의 쉼표로 구분 된 목록을 반환하는 메시지 레코드의 carbon_copy_id null이 아닌 곳입니다.

아이디어는 메시지 목록을 반환하고 메시지가 카본으로 복사 될 때 중복 메시지를 표시하지 않는 것입니다. GMAIL과 비슷한 방식입니다.

도움을 주시면 감사하겠습니다.

답변

0

먼저 디자인 관점에서 보면 cc 테이블에 외래 메시지 표가있는 것으로 보입니다. cc 테이블은 추가받는 사람을 저장하려는 메시지의 messageid를 참조하는 다른 방법 일 수 있습니다.

그렇다면 여기서는 메시지와 수신자 목록의 두 가지 쿼리를 사용해야합니다. 이 방법은 테이블 디자인으로 쉼표로 구분 된 목록을 반환하는 것보다 나은 솔루션입니다.