Как отфильтровать определенный набор значений в SQL и только этот конкретный набор? - PullRequest
0 голосов
/ 27 января 2011

У меня проблема с унаследованной базой данных, для которой человек, который ее первоначально настроил, оставил мало документации.

У меня есть набор пользователей, каждый из которых имеет три потенциальных занятия.При запросе он возвращает значения, подобные этим:

USER_ID CAREER_ID   TITLE
1       44           Agricultural Engineer
1       136          Educational Psychologist
1       132          Clinical Psychologist
18      245          3D Designer
18      2            Accountant - Private Practice
18      1            Accountant - Industry and Commerce
19      245          3D Designer
19      2            Accountant - Private Practice
19      1            Accountant - Industry and Commerce
20      128          Advice Centre Worker
20      130          Careers Adviser
20      129          Care Assistant
21      1            Accountant - Industry and Commerce
21      245          3D Designer
21      2            Accountant - Private Practice
23      245          3D Designer
23      2            Accountant - Private Practice
23      1            Accountant - Industry and Commerce
29      245          3D Designer
29      2            Accountant - Private Practice
29      1            Accountant - Industry and Commerce
30      219          PC Games Tester
30      173          Bouncer
30      103          Stunt Person
32      245          3D Designer
27      2            Accountant - Private Practice
27      1            Accountant - Industry and Commerce
27      245          3D Designer
30      219          PC Games Tester
30      173          Bouncer
30      103          Stunt Person

Как видите, по какой-то причине карьеры 1, 2 и 245 установлены по умолчанию.Теперь я хочу отфильтровать пользователей, у которых есть определенный набор карьер, но не все их экземпляры, поскольку любой пользователь мог законно выбрать один или два набора.

Я могу смириться с отфильтровыванием нечетного персонажа, который на самом деле мог специально выбрать именно этот набор.

Надеюсь, кто-то может помочь.Я уверен, что решение довольно простое, но я не могу придумать его.

Ответы [ 3 ]

1 голос
/ 27 января 2011
Select ...
From Occupations O
Where Not Exists    (
                    Select 1
                    From Occupations O1
                    Where O1.Career_Id In(1,2,245)
                        And O1.User_Id = O.User_Id
                    Group By O1.User_Id
                    Having Count(*) = 3
                    )

Другое решение:

Select ...
From Occupations O
Where Exists    (
                Select 1
                From Occupations O1
                Where O1.Career_Id Not In(1,2,245)
                    And O1.User_Id = O.User_Id
                )

Выгода с вышеупомянутым решением состоит в том, что он исключит тех, у которых есть только меньше, чем все три карьеры по умолчанию.То есть, это исключит пользователей, которые только имеют (1,2), (1,245), (2,245), (1), (2), (245).Если они должны иметь все три и только эти три, то вам нужно изменить это решение так:

Select ...
From Occupations O
Where Exists    (
                Select 1
                From Occupations O1
                Where O1.Career_Id Not In(1,2,245)
                    And O1.User_Id = O.User_Id
                )
Or Exists   (
            Select 1
            From Occupations O2
            Where O2.User_Id = O.User_Id
            Having Count(*) < 3
            )
0 голосов
/ 27 января 2011

Если у вас есть пользовательская таблица, таблица карьеры и таблица сопоставления (user_career_map), то вы получите то, что ищете:

SELECT user_id, career_id, title
FROM (
  SELECT distinct m.user_id, m.career_id, c.title
    , sum(case when m.career_id in (1, 2, 245) then 1 else 0 end) over (partition by     m.user_id) filter
  FROM user_career_map m inner join career c on m.career_id = c.career_id
) WHERE filter <> 3
ORDER BY user_id, career_id;
0 голосов
/ 27 января 2011

Я думаю, что это должно идентифицировать пользователей, у которых есть карьеры 1, 2 и 245 в списке:

SELECT User_ID
  FROM Occupations
 WHERE Career_ID IN (1, 2, 245)
 GROUP BY Career_ID
HAVING COUNT(*) = 3

Если вы хотите получить список пользователей, у которых нет такого набора профессий, тогда:

SELECT User_ID
  FROM Occupations
 WHERE User_ID NOT IN
       (SELECT User_ID
          FROM Occupations
         WHERE Career_ID IN (1, 2, 245)
         GROUP BY Career_ID
        HAVING COUNT(*) = 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...