Два набора данных oracle db. Как выбрать данные, которые находятся в одном наборе, а не в другом, и наоборот - PullRequest
1 голос
/ 26 октября 2011

У меня есть эти два подзапроса, которые я начал работать

(

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.ENTITLEMENTNAME для каждого join1.USER_ID для того же join2.ID в join2.НАЗВАНИЕ.Если он не существует, мне нужна строка с именем join1.USERNAME join1.DEPARTMENT, join1.FIRSTNAME, join1.LASTNAME, join1.TITLE, join1.ENTITLEMENTNAME, join1.APPLICATIONNAME

I, вв то же время нужно проверить, существует ли каждое join2.NAME для каждого join2.ID для того же join1.USER_ID в join1.ENTITLEMENTNAME

Я немного растерялся, как это сделать, но я уверен, что это такс каким-либо типом объединения.

Примечания: сравнение join1.ENTITLEMENTNAME с join2.NAME и идентификаторами использования находятся в join1.USER_ID и join2.ID.

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

Дополнительные очки брауни, если вы поможете мне с регулярным выражением.Join2.NAME хранятся как сами по себе, но join1.ENTITLEMENTNAME хранятся как "/ fis /". Я не совсем уверен, как отфильтровать это, поэтому было бы полезно, если бы кто-нибудь мог объяснить.

Спасибозаранее!

1 Ответ

1 голос
/ 26 октября 2011

Вы смотрели на команду 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\/%' должно сработать.Вам нужно было сбежать '/'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...