SQL Server 2005从带有条件和连接的select中插入

时间:2011-06-10 05:43:08

标签: sql sql-server sql-server-2005

好的,所以考虑到下面数据库的集群软糖(SQL Server 2005),我需要做以下几点:

  • 获取不重复的temp.empid的users.id(easy ids = 3,4,简单连接)
  • 获取那些重复但存在于oldLog中的temp.empid的users.id(easy ids = 1,7很容易,有2个连接)
  • 获取旧文件中重复且缺少的temp.empid的users.id(wtf应为id = 8) 母亲负担=>此用户不在oldLog上并且是重复的,因此我必须同时检查dbo.firstCriteria和dbo.secondCriteria。 _ 如果金额为200,我检查dbo.firstCriteria是否已完成计数> = 3. _ 如果金额为100,我会检查dbo.secondCriteria是否已完成。
  • 插入newLog

dbo.users

id  |   empid
=============
1   |   1234
2   |   2345
3   |   3456
4   |   4567 (Missing log table)
5   |   5678 (Missing temp table)
6   |   1234 (Duplicate empid)
7   |   2345 (Duplicate empid)
8   |   6789 (The Mother Load Missing from oldLog and duplicate empid)
9   |   6789
10  |   1111 (The Mother Load Missing from oldLog and duplicate empid)
11  |   1111

dbo.temp

empid         | amount
========================
1234 (id 1)   | 200
2345 (id 7)   | 200
3456 (id 3)   | 100
4567 (id 4)   | 100
6789 (id 8)   | 200
1111 (id 11)  | 100

dbo.oldLog

id
==
1
3
7

dbo.firstCriteria

id  |   task    |   status
===========================
1   |   task1   |   completed
1   |   task2   |   completed
1   |   task3   |   completed
2   |   task1   |   completed
3   |   task1   |   completed
8   |   task1   |   completed
8   |   task2   |   completed
8   |   task3   |   completed

dbo.secondCriteria

id  |   status
==============
1   |   completed
7   |   completed
3   |   completed
11  |   completed

dbo.newLog

BLANK

我的结果如下:

id  |   empid
=============
1   |   1234
7   |   2345
3   |   3456
4   |   4567
8   |   6789
11  |   1111

这就是我的尝试并被卡住了:

SELECT users.id
FROM   TEMP
       JOIN users
         ON users.empid = TEMP.empid
WHERE  users.empid NOT IN (SELECT users.empid
                           FROM   users
                           GROUP  BY users.empid
                           HAVING COUNT(users.empid) > 1)
UNION ALL
SELECT users.id
FROM   TEMP
       JOIN users
         ON users.empid = TEMP.empid
WHERE  users.empid IN (SELECT users.empid
                       FROM   users
                       GROUP  BY users.empid
                       HAVING COUNT(users.empid) > 1)
       AND users.id IN (SELECT oldlog.id
                        FROM   oldlog)  
UNION ALL
--????

1 个答案:

答案 0 :(得分:0)

这是你在UNION ALL之后的查询

SELECT users.id
FROM   TEMP
       JOIN users
         ON users.empid = TEMP.empid
WHERE  users.empid IN (SELECT users.empid
                       FROM   users
                       GROUP  BY users.empid
                       HAVING COUNT(users.empid) > 1)
       AND users.id NOT IN (SELECT oldlog.id  FROM   oldlog)
       AND 1 = CASE TEMP.amount
                    WHEN 200 THEN
                        SELECT 1 FROM dbo.firstCriteria WHERE id = TEMP.id AND status = 'completed' AND COUNT(*) >= 3
                    WHEN 100 THEN
                        SELECT 1 FROM dbo.secondCriteria WHERE id = TEMP.id AND status = 'completed'
                END