#sql #database #oracle
#sql #База данных #Oracle
Вопрос:
У меня есть эти два подзапроса, которые у меня работают
(
SELECT GLOBAL_USERS.ID AS USER_ID, GLOBAL_USERS.USER_ID AS USERNAME,
GLOBAL_USERS.DEPARTMENT AS DEPARTMENT,
GLOBAL_USERS.FIRST_NAME AS FIRSTNAME, GLOBAL_USERS.LAST_NAME AS LASTNAME,
GLOBAL_USERS.TITLE AS TITLE,
USER_FIRST_ENTITLEMENTS.ENTITLEMENT_NAME AS ENTITLEMENTNAME,
USER_FIRST_ENTITLEMENTS.APPLICATION_NAME AS APPLICATIONNAME
FROM GLOBAL_USERS
INNER JOIN USER_FIRST_ENTITLEMENTS
ON GLOBAL_USERS.ID=USER_FIRST_ENTITLEMENTS.USER_ID AND
(USER_FIRST_ENTITLEMENTS.APPLICATION_NAME='MY APPLICATION NAME'
AND USER_FIRST_ENTITLEMENTS.ENTITLEMENT_NAME LIKE '%fis%')
) join1
(
SELECT DISTINCT injoin1.ID,injoin2.APPLICATION_ROLE_ID, injoin2.NAME FROM
(
SELECT GLOBAL_USERS.ID,USER_SECOND_ENTITLEMENTS.APPLICATION_ROLE_ID
FROM GLOBAL_USERS
INNER JOIN USER_SECOND_ENTITLEMENTS
ON GLOBAL_USERS.ID=USER_SECOND_ENTITLEMENTS.USER_ID
) injoin1,
(
SELECT USER_SECOND_ENTITLEMENTS.APPLICATION_ROLE_ID,SECOND_ENTITLEMENT_DEFINITIONS.NAME
FROM USER_SECOND_ENTITLEMENTS
INNER JOIN SECOND_ENTITLEMENT_DEFINITIONS
ON USER_SECOND_ENTITLEMENTS.APPLICATION_ROLE_ID=SECOND_ENTITLEMENT_DEFINITIONS.ID
) injoin2
WHERE injoin1.APPLICATION_ROLE_ID=injoin2.APPLICATION_ROLE_ID
) join2
по сути, что мне нужно сделать сейчас, так это посмотреть, каждый ли join1.ИМЯ_ПРАВИЛ для каждого join1.USER_ID существует для того же join2.ИДЕНТИФИКАТОР в join2.NAME . Если он не существует, то мне нужно иметь строку с надписью join1.USERNAME join1.ОТДЕЛ, join1.FIRSTNAME, join1.ФАМИЛИЯ, join1.ЗАГОЛОВОК, join1.ИМЯПРАВИЛ, присоединение1.APPLICATIONNAME
В то же время мне нужно посмотреть, все ли join2.NAME для каждого соединения2.Идентификатор существует для того же join1.USER_ID в join1.ИМЯПРАВИЛ
Я немного не понимаю, как это сделать, но я уверен, что это связано с каким-то типом соединения.
Примечания: сравнение join1.ИМЯ_ПРАВИЛА с join2.NAME ‘s и идентификаторы пользователей находятся в join1.USER_ID и join2.ID .
Я не беспокоюсь об эффективности или скорости, мне просто нужна функциональность, поэтому простого ответа будет достаточно.
Дополнительные дополнительные очки, если вы поможете мне с регулярным выражением. join2.NAME ‘s хранятся как сами по себе, но join1.ИМЯПРАВИЛ хранятся как «/ fis /» Я не совсем уверен, как фильтровать это, поэтому было бы полезно, если бы кто-нибудь мог объяснить.
Заранее спасибо!
Ответ №1:
Вы изучали команду Oracle MINUS? Это похоже на обратное ОБЪЕДИНЕНИЕ. Он вычитает сходства между двумя запросами, так что результирующий набор представляет собой разницу между ними. Похоже, это именно то, что вам нужно. Просто возьмите свой первый набор и МИНУС второй набор.
Я думаю, что приведенный ниже код соответствует тому, что вы описали, но вам может потребоваться изменить его, чтобы он точно соответствовал вашим потребностям.
SELECT
GLOBAL_USERS.ID AS USER_ID,
GLOBAL_USERS.USER_ID AS USERNAME,
GLOBAL_USERS.DEPARTMENT AS DEPARTMENT,
GLOBAL_USERS.FIRST_NAME AS FIRSTNAME,
GLOBAL_USERS.LAST_NAME AS LASTNAME,
GLOBAL_USERS.TITLE AS TITLE,
USER_FIRST_ENTITLEMENTS.ENTITLEMENT_NAME AS ENTITLEMENTNAME,
USER_FIRST_ENTITLEMENTS.APPLICATION_NAME AS APPLICATIONNAME
FROM GLOBAL_USERS
INNER JOIN USER_FIRST_ENTITLEMENTS
ON GLOBAL_USERS.ID=USER_FIRST_ENTITLEMENTS.USER_ID
AND ( USER_FIRST_ENTITLEMENTS.APPLICATION_NAME='MY APPLICATION NAME'
AND USER_FIRST_ENTITLEMENTS.ENTITLEMENT_NAME LIKE '%fis%')
MINUS
SELECT
GLOBAL_USERS.ID AS USER_ID,
GLOBAL_USERS.USER_ID AS USERNAME,
GLOBAL_USERS.DEPARTMENT AS DEPARTMENT,
GLOBAL_USERS.FIRST_NAME AS FIRSTNAME,
GLOBAL_USERS.LAST_NAME AS LASTNAME,
GLOBAL_USERS.TITLE AS TITLE,
USER_SECOND_ENTITLEMENTS.ENTITLEMENT_NAME AS ENTITLEMENTNAME,
USER_SECOND_ENTITLEMENTS.APPLICATION_NAME AS APPLICATIONNAME
FROM GLOBAL_USERS
INNER JOIN USER_SECOND_ENTITLEMENTS
ON GLOBAL_USERS.ID=USER_SECOND_ENTITLEMENTS.USER_ID
AND ( USER_SECOND_ENTITLEMENTS.APPLICATION_NAME='MY APPLICATION NAME'
AND USER_SECOND_ENTITLEMENTS.ENTITLEMENT_NAME LIKE '%fis%')
Что касается регулярного выражения, '%/fis/%'
должно сработать. Вам нужно было экранировать '/'
.
Комментарии:
1. спасибо за совет. Я проведу небольшое исследование! что касается регулярного выражения, я имел в виду, что когда я сравниваю два права, сравнение выглядит как «бла / бла / бла / fis / entitl3″ =»entitl3», мне нужно отфильтровать сравнение
2. Вы можете поставить NOT перед LIKE, чтобы исключить совпадения.