SQL Server 2005 вставить из select с условными обозначениями и соединениями

#sql #sql-server #sql-server-2005

#sql #sql-сервер #sql-server-2005

Вопрос:

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

  • Получить users.id для временных идентификаторов, которые не дублируются (простые идентификаторы = 3, 4 с простым соединением)
  • Получить users.id для временных идентификаторов, которые дублируются, но существуют в старом журнале (простые идентификаторы = 1, 7 достаточно просто с 2 объединениями)
  • Получить users.id для temp.empid, который дублируется и отсутствует в старом журнале (wtf должен быть id = 8) Материнская загрузка => Этот пользователь отсутствует в старом журнале и является дубликатом, поэтому я должен проверить как dbo.firstCriteria, так и dbo.secondCriteria. _если сумма равна 200, я проверяю dbo.firstCriteria на предмет завершения count > = 3._ если сумма равна 100, я проверяю dbo.secondCriteria на предмет завершения.
  • вставить в журнал создания

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.Вторые критерии

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

dbo.newLog

ПУСТО

Мои результаты должны быть следующими:

 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. Не могли бы вы объяснить в одном-двух предложениях, что именно должен включать проблемный запрос, пожалуйста?

Ответ №1:

Это будет ваш запрос после объединения ВСЕХ

 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