2

私は投票アプリケーションに取り組んでいます。SQL スキーマは次のとおりです。

polls -> * options (poll_id) -> * answers (option_id)

または:「投票には多くのオプションがあり、オプションには回答(別名投票)があります」

poll ごとにユーザーごとに 1 票しか許可できません。これはマージ句です(明らかに機能しません):

  merge into answers
  using (select count(*)
         from answers, options, polls
         where answers.option_id = options.id
         and options.poll_id = polls.id
         and polls.id = {poll_id}
         and answers.owner_id = {owner_id}) votes
  on (votes = 0)
  when matched then
  insert into answers values (NULL, {option_id}, {owner_id}, NOW())
4

2 に答える 2

1

更新したくない場合は、単純な挿入で十分です。マージの必要性はまったくありません。

insert into answers (some_value, option_id, owner_id, last_modified)
select null, {option_id}, {owner_id}, current_timestamp
from dual
where not exists (select 1 
                  from answers a
                    join options o on o.id = a.option_id
                    join polls p on p.id = o.poll_id
                  where a.owner_id = {owner_id}
                    and p.id = {polls_id}

そうしないのはコーディングスタイルが悪いため、挿入句の列を明示的にリストしました。テーブル定義を見せてくれなかったので、もちろん列名を推測しただけです。

于 2012-07-16T21:59:26.337 に答える
0

これを試して:

MERGE INTO answers
USING 
(SELECT options.id 
             FROM options, polls
             WHERE options.poll_id = polls.id
             AND polls.id = {poll_id}
) options
ON (answers.option_id = options.id AND answers.owner_id = {owner_id})
WHEN NOT MATCHED THEN
    INSERT INTO answers VALUES (NULL, {option_id}, {owner_id}, SYSDATE)
WHEN MATCHED THEN
    -- Do what you need to do for an update
于 2012-07-16T21:59:51.907 に答える