>source

다음과 같은 구조를 가지고 있습니다.

채팅 메시지 테이블:

Column   |            Type             | Collation | Nullable | Default
-----------+-----------------------------+-----------+----------+---------
 Id        | text                        |           | not null |
 SenderId  | text                        |           |          |
 Message   | text                        |           |          |
 ChatId    | text                        |           |          |
 CreatedAt | timestamp without time zone |           | not null |
Indexes:
    "PK_ChatMessages" PRIMARY KEY, btree ("Id")
    "IX_ChatMessages_ChatId" btree ("ChatId")
    "IX_ChatMessages_SenderId" btree ("SenderId")
Foreign-key constraints:
    "FK_ChatMessages_ChatUsers_SenderId" FOREIGN KEY ("SenderId") REFERENCES "ChatUsers"("Id") ON DELETE RESTRICT
    "FK_ChatMessages_Chats_ChatId" FOREIGN KEY ("ChatId") REFERENCES "Chats"("Id") ON DELETE RESTRICT

ChatUsers 테이블:

Column   |            Type             | Collation | Nullable | Default
-----------+-----------------------------+-----------+----------+---------
 Id        | text                        |           | not null |
 Username  | text                        |           |          |
 Email     | text                        |           |          |
 CreatedAt | timestamp without time zone |           | not null |
Indexes:
    "PK_ChatUsers" PRIMARY KEY, btree ("Id")
Referenced by:
    TABLE ""ChatMessages"" CONSTRAINT "FK_ChatMessages_ChatUsers_SenderId" FOREIGN KEY ("SenderId") REFERENCES "ChatUsers"("Id") ON DELETE RESTRICT
    TABLE ""Chats"" CONSTRAINT "FK_Chats_ChatUsers_User1Id" FOREIGN KEY ("User1Id") REFERENCES "ChatUsers"("Id") ON DELETE RESTRICT
    TABLE ""Chats"" CONSTRAINT "FK_Chats_ChatUsers_User2Id" FOREIGN KEY ("User2Id") REFERENCES "ChatUsers"("Id") ON DELETE RESTRICT

실행하면"ChatMessages", "ChatUsers"에서 "SenderId", "Email", "Message"를 선택하십시오.모든 메시지가 포함된 목록을 받지만 각 메시지에 사용자의 이메일 주소가 곱해집니다.

           SenderId               |        Email        |                        Message
--------------------------------------+---------------------+-------------------------------------------------------
 2f5aca90-0599-400c-8455-31a22c1d4dcd | [email protected] | This is a test message.
 2f5aca90-0599-400c-8455-31a22c1d4dcd | [email protected] | This is also a test message.
 b3e218e6-dd41-4223-978b-a54f46fc465e | [email protected] | okay ...
 2f5aca90-0599-400c-8455-31a22c1d4dcd | [email protected] | This is a test message.
 2f5aca90-0599-400c-8455-31a22c1d4dcd | [email protected] | This is also a test message.
 b3e218e6-dd41-4223-978b-a54f46fc465e | [email protected] | okay ...

하지만 다음과 같이 표시하고 싶습니다.

           SenderId               |        Email        |                        Message
--------------------------------------+---------------------+-------------------------------------------------------
 2f5aca90-0599-400c-8455-31a22c1d4dcd | [email protected]   | This is a test message.
 2f5aca90-0599-400c-8455-31a22c1d4dcd | [email protected]   | This is also a test message.
 b3e218e6-dd41-4223-978b-a54f46fc465e | [email protected]   | okay ...

그것에 대한 올바른 쿼리는 무엇입니까?

두 테이블 간에 조인을 만들지 않습니다. 그것이 문제라고 생각합니다.

William Andrés Bernal2021-09-22 13:52:16

@WilliamAndrésBernal 보통 ORM을 사용하기 때문에 SQL을 직접 작성하지 않습니다. 설명서를 읽고 * from one_table, another_table; 조인 구문을 사용하는 대신 새로운 구문입니다. 그러나 오른쪽, 왼쪽, 외부 등과 같은 다른 조인 유형을 사용해야 할 수도 있습니다.

TommyTheReal2021-09-22 13:55:54

결과에서 볼 수 있듯이 자동으로 JOIN을 생성하지 않습니다. 예를 들어 "테스트 메시지입니다"는 두 발신자 모두에게 있습니다. FK에 정의된 대로 간단한 JOIN을 넣습니다.

William Andrés Bernal2021-09-22 14:00:17

@WilliamAndrésBernal 어떤 조인 유형이 필요합니까?

TommyTheReal2021-09-22 14:03:12

다음과 같이 시도하십시오(postgres 구문): SELECT cm.SenderId, cu.Email, cm.Message FROM ChatMessages cm JOIN ChatUsers cu ON cm.SenderId= cu.Id

William Andrés Bernal2021-09-22 14:08:11
  • 답변 # 1

    이것으로 시도하십시오(postgres 구문):

    SELECT cm.SenderId, cu.Email, cm.Message FROM ChatMessages cm JOIN ChatUsers cu ON cm.SenderId= cu.Id
    

  • 이전 배포 JAR이 프로덕션 Quarkus 앱에 패키징되는 이유는 무엇입니까?
  • 다음 Azure ADF 복사된 동일한 파일도 삭제되도록 하는 방법은 무엇입니까?