Похоже, вы пытаетесь выяснить, кто получил оценку от А до В, поэтому мы также предполагаем, что вам нужны результаты, где В следует за А для того же администратора.
SELECT DISTINCT t1.Col2
FROM table t1
INNER JOIN table t2 ON t1.Col2 = t2.Col2
LEFT OUTER JOIN table t3 ON t1.Col2 = t3.Col2
AND t3.Col1 < t2.Col1 AND t3.Col1 > t1.Col1
WHERE t1.Col3 = 'A'
AND t2.Col3 = 'B' AND t2.Col1 > t1.Col1
AND t3.Col1 IS NULL
Это дает любому администратору, у которого есть «A» и «B».
INNER JOIN и первые два выражения в предложении WHERE находят все записи, где «B» встречается после «A». Левое соединение OUTER и последнее выражение в предложении WHERE находят все записи, где есть оценки между A и B, и принимают только записи без.
Вы просили получить эти результаты, по одному в строке, например:
Col1 Col2 Col3
---- ------- --------
1 Admin001 A
6 Admin001 B
Я собираюсь легко адаптировать вышеуказанный запрос.
Я просто получу записи A, получу записи B и объединю их:
(SELECT t1.Col1, t1.Col2, t1.Col3
FROM table t1
INNER JOIN table t2 ON t1.Col2 = t2.Col2
LEFT OUTER JOIN table t3 ON t1.Col2 = t3.Col2
AND t3.Col1 < t2.Col1 AND t3.Col1 > t1.Col1
WHERE t1.Col3 = 'A'
AND t2.Col3 = 'B' AND t2.Col1 > t1.Col1
AND t3.Col1 IS NULL)
UNION
(SELECT t2.Col1, t2.Col2, t2.Col3
FROM table t1
INNER JOIN table t2 ON t1.Col2 = t2.Col2
LEFT OUTER JOIN table t3 ON t1.Col2 = t3.Col2
AND t3.Col1 < t2.Col1 AND t3.Col1 > t1.Col1
WHERE t1.Col3 = 'A'
AND t2.Col3 = 'B' AND t2.Col1 > t1.Col1
AND t3.Col1 IS NULL)
ORDER BY Col2, Col1
Обратите внимание, что сначала мы заказываем Col2
, затем Col1
. Вы также можете получить более одного набора записей для каждого пользователя.