0

ここで問題があります。

現在、3つのテーブル(ペット、住所、連絡先)があります。

USER TABLE COLUMNS:
          PET_ID_PK
          PETNAME
          ADDRESS_ID_FK
          CONTACT_ID_FK
          GENDER
          OWNER_ID
          BOUGHT_DATE

ADDRESS TABLE COLUMNS:
          ADDRESS_ID_PK
          ADDRESS_STRING

CONTACT TABLE COLUMNS:
          CONTACT_ID_PK
          CONTACT_NUMBER

これらのテーブルを次の列を持つ1つのテーブルに結合したいと思います。

          PET_ID_PK
          PETNAME
          ADDRESS_STRING
          CONTACT_NUMBER
          GENDER

そして、特定のOWNER_IDに属するペットを取得し、GENDERの順序で行を表示したいと思います(最初に女性、次に男性)。この場合、ORDERBYCASEを使用できます。

ただし、各ユーザーテーブルエントリでは、ADDRESS_ID_FKまたはCONTACT_ID_FKのいずれかがNULL値になります。したがって、 NULL値の列を打ち消す、列数の異なる2つのテーブルの結合で提供されるソリューションを参照して、次のクエリを考え出しました。

SELECT DISTINCT ON (pets.pet_id_pk) * FROM 
((SELECT pet_id_pk, petname, address_string, NULL AS contact_id_fk, gender 
     FROM user JOIN address ON address.address_id_pk=address_id_fk) 
UNION 
(SELECT pet_id_pk, petname, NULL AS address_string, contact_id_fk, gender 
    FROM user JOIN address ON contact.contact_id_pk=contact_id_fk) AS pets 
WHERE OWNER_ID=$1 ORDER BY (CASE WHEN gender=female ELSE 2 END), bought_date DESC

ただし、このクエリはそれに応じて機能していません。

誰かがこれで私を助けてくれることを願っています。ありがとうございました。

4

1 に答える 1

1

以下を試してください:

SELECT u.pet_id_pk, u.petname, a.address_string, c.contact_number, u.gender 
FROM user u
LEFT JOIN address a ON u.address_id_fk=a.address_id_pk
LEFT JOIN contact c ON u.contact_id_fk=c.contact_id_pk
WHERE OWNER_ID=$1 ORDER BY u.gender,bought_date DESC

LEFT JOIN を使用できます。LEFT JOIN は、一致結果がなくてもテーブルを表示します。

ORDER BY については、ORDER BY のみを使用することで CASE を使用する必要は実際にはありません。FEMALE の後に MALE が表示されます。ORDER BY CASE を使用する特定の理由はありますか?

于 2012-07-19T05:28:45.290 に答える