Выберите значения из одной таблицы, рассматривая первый выбор как условие - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть таблица SQLite, где я храню информацию о компании / филиалах со следующей структурой:

   id  |  id_branch  |  username  | position |  
-------+-------------+------------+----------
   1   |     111     |     ana    |  manager
   2   |     222     |    steph   |  officer
   3   |     111     |    carl    |  officer
   4   |     111     |    alex    |  officer

Учитывая имя пользователя, мне нужно получить идентификаторы в соответствии со следующими правилами:

  1. если должность данного имени пользователя является менеджером, принесите мне все идентификаторы всех, кто работает для одного и того же id_branch.Пример: учитывая "ану", я должен получить 1, 3 и 4, как только она станет менеджером.
  2. , если должность данного имени пользователя - офицер, принесите только идентификатор самого себя.Пример: учитывая "carl", я должен получить только 3, как только он будет офицером.

Как бы я сделал этот оператор условного выбора в SQL?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вы можете попытаться использовать самостоятельное соединение с некоторым условием.

Схема (SQLite v3.18)

CREATE TABLE T (
   id int,
   id_branch int,
   username varchar(50),
   position varchar(50)
);


 insert into T values (1,111,'ana' ,'manager');
 insert into T values (2,222,'steph'  ,'officer');
 insert into T values (3,111,'carl'  ,'officer');
 insert into T values (4,111,'alex'  ,'officer');

Запрос № 1

SELECT t2.*
FROM T t1 
INNER JOIN T t2 On 
    t1.id_branch = t2.id_branch and t1.position = 'manager' 
 or 
    t1.id = t2.id and t1.position = 'officer'
where t1.username = 'ana';

| id  | id_branch | username | position |
| --- | --------- | -------- | -------- |
| 1   | 111       | ana      | manager  |
| 3   | 111       | carl     | officer  |
| 4   | 111       | alex     | officer  |

Просмотр на БД Fiddle

0 голосов
/ 14 сентября 2018

Заманчиво подойти к этому как union all запрос. Однако эти условия можно обнаружить с помощью простого самостоятельного объединения:

select t.*
from t cross join
     t tu
where tu.username = ? and
      ( (tu.position = 'manager' and t.branch_id = tu.branch_id) or
        (tu.position = 'officer' and t.id = tu.id)
      );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...