如何用连接,set减法,子查询编写SQL语句

时间:2013-08-01 06:12:30

标签: mysql sql

我们的软件有问题跟踪系统。昨天我的老板给了我一个任务,就是找到这个ID为2992的人提交的问题表中的所有问题:

问题表:

issue_id (int)
submitter_id (int)
...other fields

然后对于该结果集中的每个问题,我必须查看另一个表以查找订阅者:

issue_subscribers表:

issue_id (int) [primary key to issue table]
subscriber_id (int)
...other fields

我有这些ID号码(3247,4748,7430,8429)代表其他用户,如果其中任何一个未订阅,我不得不将它们添加为问题的订阅者。这意味着只需向issue_subscribers表添加一个新行。

这是我的头脑。我最终在Java JDBC程序中使用3个不同的查询执行此操作,而不是尝试使用纯SQL来解决它。但现在我很好奇如何做到这一点。对于专业SQL人员来说这是一个简单的程序吗?是否可以编写单个查询来执行此操作?怎么做?

1 个答案:

答案 0 :(得分:0)

假设:

  • subscriber_id是某个表中的foreign key,其中包含所有可能的subscribers
  • 您只需要在问题2992和订阅者3247,4748,7430和8429上执行此操作。

您可以编写以下SQL查询:

Insert Into issue_subscribers
(
  issue_id,
  subscriber_id
  -- and other fields if necessary
)
(
  Select 2992 issue_id,
         subscriber_id
         -- and other fields if necessary
    From subscribers subs -- table that holds all possible subscribers
   Where subscriber_id In (3247, 4748, 7430, 8429)
     And Not Exists (Select 1
                       From issue_subscribers iss
                      Where issue_id = 2992
                        And iss.subscriber_id = subs.subscriber_id)

);

如果您需要将其用于其他问题和订阅者,则需要将ID更改为参数,并以其他方式指定subscriber_ids条件的in(可能是子选项)某种)。