#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