Два набора данных oracle db. Как мне выбрать данные, которые находятся в одном наборе, а не в другом, и наоборот

#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, чтобы исключить совпадения.