SQL Server 2005 вставить из выбора с условными и объединений - PullRequest
1 голос
/ 10 июня 2011

Хорошо, поэтому, учитывая пометку кластера базы данных ниже (SQL Server 2005), мне нужно сделать следующее:

  • Получите users.id для temp.empid, которые не являются дубликатами (easy ids = 3, 4 с простым объединением)
  • Получите users.id для temp.empid, которые являются дубликатами, но существуют в oldLog (easy ids = 1, 7 достаточно легко с 2 объединениями)
  • Получите users.id для temp.empid, который повторяется и отсутствует в oldLog (wtf должен быть id = 8) The Mother Load => Этот пользователь не входит в 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 голосов
/ 10 июня 2011

Это будет ваш запрос после 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...