- PR -

子レコードの存在判定について

1
投稿者投稿内容
nikori
会議室デビュー日: 2008/03/13
投稿数: 11
投稿日時: 2008-03-21 23:18
お世話になります。

SQLについて教えてください。

【環境】
HSQLDB 1.8.0

次のような2つのテーブルがあり、
CATEGORYテーブルとITEMテーブルは1対多の関係です。
コード:
create table CATEGORY (
  ID  bigint,
  NAME varchar(32) not null,
  primary key(ID)
);

create table ITEM (
  ID bigint,
  NAME varchar(32) not null,
  CATEGORY_ID bigint not null,
  primary key(ID)
);

ALTER TABLE ITEM
  ADD CONSTRAINT FK_ITEM_CATEGORY_ID
      FOREIGN KEY (CATEGORY_ID)
      REFERENCES CATEGORY (ID);



このテーブルを検索して次のようなカテゴリ一覧を取得したいと思っています。
コード:
(
カテゴリID, 
カテゴリ名, 
当該カテゴリに商品が存在するかどうかのboolean値(true:有, false:無)
)



次のようなSQLを実行し、
"itemCount"が0より大きいかどうかをプログラムでチェックすることで
そのカテゴリに商品が存在するか判定できるのですが、
SQLの結果として「当該カテゴリに商品が存在するかどうかのboolean値(true:有, false:無)」
を取得するにはどのようにSQLを書けばよいのでしょうか?
コード:
select
  c.ID as categoryId
, max(c.NAME) as categoryName
, sum(
    case
      when i.id is NULL then 0
      else 1
    end
  ) as itemCount
from
  CATEGORY c
  left outer join
  ITEM i
    on (c.ID = i.CATEGORY_ID)
group by
  c.ID
;



どうぞよろしくお願いします。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-03-22 14:10
こんにちは。

HSQLDBで使えるかどうかわかりませんが、下記でどうでしょうか?
HSQLDBってbooleanが使えるんですね。

コード:
select
  c.ID as categoryId
, c.NAME as categoryName
, case
    when i.id is NULL then false
      else true
  end as hantei
from
  CATEGORY c
  left outer join
  (
      SELECT DISTINCT
         id
      FROM ITEM
  ) i
    on (c.ID = i.CATEGORY_ID)
;


nikori
会議室デビュー日: 2008/03/13
投稿数: 11
投稿日時: 2008-03-23 03:22
よっしーさん
はじめまして。

ご教示して頂いたSQLで実行することができました。
コード:
select
  c.id as categoryId
, c.name as categoryName
, case
    when i.category_id is NULL then 0
    else 1
  end as hantei
from
  category c
  left outer join
  (
    select distinct
      category_id
    from
      item
  ) i
    on (c.id = i.category_id)
;


なるほど!
こういう発想が柔軟にできるようになりたい

引用:

HSQLDBってbooleanが使えるんですね。


SQLをbooleanを返すようにすると、
SQL入力用GUIツールがハングアップしてしまいました ^^;
使えないのですね。

どうもありがとうございました。
またよろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)