2

ねえ、私は、間のテーブルと多対多の関係で設定されているデータベーステーブルをクエリしようとしています。ここに問題のテーブルの簡単な群れがあります

 Homes ----<  Home_Feature  >---- Features

以下のSQLクエリを作成しようとしましたが、ここで返される多くの行ではなく、ホームごとに1つの行を返す方法はありますか?または、より良いソリューションに対応するためにテーブル構造を変更する必要がありますか?

 SELECT homes.title, homes.description, homes.living_room_count, homes.bedroom_count, homes.bathroom_count, features.feature_name
 FROM homes
 INNER JOIN home_feature
 ON homes.home_id = home_feature.home_id
 INNER JOIN features
 ON home_feature.feature_id = features.feature_id;

クエリからの出力:

    Title     Feature   ....
 1  House A   Balcony    
 2  House A   Pool
 3  House A   Garage
 4  House B   Air-Con

ありがとう、助けてくれてありがとう!

  ____________________EDIT__________________________

ねえ、皆さんがこれまでに提供してくれた助けに大いに感謝し、このクエリへの追加と別のテーブルからの列の選択に関してもう少し助けが必要かどうか疑問に思っていました。

SELECTステートメントに他のテーブルの列を追加し、FROM句にテーブルを追加するだけで、クエリが機能しないように見えますか?使用しているクエリは以下のとおりですが、機能しません。助けてくれてありがとう。

SELECT homes.title, homes.description, homes.living_room_count, homes.bedroom_count, homes.bathroom_count, homes.price, homes.sqft, home_type.type_name,
    listagg(features.feature_name, ',') WITHIN GROUP (ORDER BY features.feature_name)  features
FROM homes, home_type
INNER JOIN home_feature
ON homes.home_id = home_feature.home_id
INNER JOIN features
ON home_feature.feature_id = features.feature_id
GROUP BY homes.title, homes.description, homes.living_room_count, homes.bedroom_count, homes.bathroom_count, homes.price, homes.sqft;

このエラーが発生します:

ORA-00904: "HOMES"."HOME_ID": invalid identifier
00904. 00000 -  "%s: invalid identifier"
4

2 に答える 2

3

Oracle 10gバージョン:

SQL> SELECT homes.title, homes.living_room_count, homes.bedroom_count, homes.bathroom_count,
  2         wm_concat(features.feature_name) features
  3    FROM homes
  4         INNER JOIN home_feature
  5                 ON homes.home_id = home_feature.home_id
  6         INNER JOIN features
  7                 ON home_feature.feature_id = features.feature_id
  8   group by homes.title, homes.living_room_count, homes.bedroom_count, homes.bathroom_count;

TITLE   LIVING_ROOM_COUNT BEDROOM_COUNT BATHROOM_COUNT FEATURES
------- ----------------- ------------- -------------- ------------------------------
House A                 1             3              1 Balcony,Pool,Garage
House B                 1             2              2 Air-Con

11gはlistaggを使用できます:

SQL> SELECT homes.title, homes.living_room_count, homes.bedroom_count, homes.bathroom_count,
  2         listagg(features.feature_name, ',') within group (order by features.feature_name)  features
  3    FROM homes
  4         INNER JOIN home_feature
  5                 ON homes.home_id = home_feature.home_id
  6         INNER JOIN features
  7                 ON home_feature.feature_id = features.feature_id
  8   group by homes.title, homes.living_room_count, homes.bedroom_count, homes.bathroom_count;

TITLE   LIVING_ROOM_COUNT BEDROOM_COUNT BATHROOM_COUNT FEATURES
------- ----------------- ------------- -------------- ------------------------------
House A                 1             3              1 Balcony,Garage,Pool
House B                 1             2              2 Air-Con
于 2013-01-15T11:00:14.973 に答える
1

これは、使用するRDBMSによって異なります。たとえば、MySQLの場合、1行ですべての機能を連結するためにGROUP_CONCATを使用できます。

SELECT homes.home_id,
       max(homes.title), 
       max(homes.description), 
       max(homes.living_room_count), 
       max(homes.bedroom_count), 
       max(homes.bathroom_count),
       GROUP_CONCAT(features.feature_name) features
 FROM homes
 INNER JOIN home_feature
 ON homes.home_id = home_feature.home_id
 INNER JOIN features
 ON home_feature.feature_id = features.feature_id
 GROUP_BY homes.home_id

ORACLE(11g r2)では、LISTAGGを使用できます

SELECT homes.home_id,
       max(homes.title), 
       max(homes.description), 
       max(homes.living_room_count), 
       max(homes.bedroom_count), 
       max(homes.bathroom_count),
       LISTAGG(features.feature_name,',') 
          WITHIN GROUP(order by features.feature_name) as features
 FROM homes
 INNER JOIN home_feature
 ON homes.home_id = home_feature.home_id
 INNER JOIN features
 ON home_feature.feature_id = features.feature_id
 GROUP_BY homes.home_id

また、Oracle10でGROUP_CONCATをエミュレートする別の方法もあります。

于 2013-01-15T10:53:53.057 に答える