2014-10-18 2 views
0

У меня есть 3 таблицы, которые я использую, чтобы сравнивать данные и находить, где запись может отсутствовать в одной из таблиц. Таблицами являются A_Client, A_USER_Defined и A_Group_Member.Найти значение, отсутствующее в таблице

A_CLIENT содержит: Имя_клиент, ClientUID

A_USER_Defined содержит: ClientUID, LOB

A_GROUP_MEMBER содержит: идентификатор, ClientUID

Таким образом, общий столбец в каждом ClientUID.

Я пытаюсь найти устройство (а), где defined.lob = «значение1» и не существует в таблице члена, где member.id = «значение2»

Пока мои поиски приходит пустой и я предполагаю, что это как-то связано с различными объединениями? Вот запрос, который я использую:

SELECT A_CLIENT.ClientName 
    , A_CLIENT.ClientUID 
    , A_USER_DEFINED.LOB 
    FROM A_CLIENT 
     INNER JOIN 
     A_USER_DEFINED ON A_CLIENT.ClientUID = A_USER_DEFINED.ClientUID 
WHERE A_USER_DEFINED.LOB = 'value1' 
    AND NOT EXISTS (
        SELECT ClientUID 
        FROM A_GROUP_MEMBER 
        WHERE GroupID = 'value2' 
       ) 

Любая помощь была бы принята с благодарностью. Спасибо.

+2

Можете ли вы показать запрос, который вы думаете, может быть близка к работе? – wallyk

+3

Кроме того, какие РСУБД вы используете? – Polynomial

ответ

0
select cli.ClientName, cli.ClientUID, def.LOB 
    from A_CLIENT cli 
     inner join A_USER_DEFINED def on def.ClientGUID = cli.ClientGUID and def.LOB = 'value1' 
     left join A_GROUP_MEMBER grp on grp.ClientUID = cli.ClientUID and mbr.ID = 'value2' 
    where mbr.UID is null 

select cli.ClientName, cli.ClientUID, def.LOB 
    from A_CLIENT cli, A_USER_DEFINED def 
    where def.ClientGUID = cli.ClientGUID and def.LOB = 'value1' 
     and cli.ClientUID not in (select ClientUID from A_GROUP_MEMBER where GroupID = 'value2') 

и различные другие возможности, в зависимости от того, какого типа соединение или предиката вашего двигателя более комфортно с

Edit: вопрос и имена таблиц/полей значительно изменились, так как я отправил свой ответ. Кажется, они успокоились, и поэтому я изменил свой код.

Примечание: предикат EXISTS в вашем запросе проверяет, есть ли вообще какие-либо записи с идентификатором = 'значение2'; он должен, вероятно, проверить только на записи, которые также имеют соответствующий UID.

Кроме того, существует некоторый путающий потенциал между ClientUID и клиентом. G UID. Это опечатка, или у вашей БД на самом деле есть оба имени? Если это последний, кто-то остро нуждается в обучении с помощью тупых инструментов.

0
select devices.* 
    from devices 
    left join member 
    on devices.ClientUID = member.ClientUID 
    and devices.lob = 'value1' 
    and member.id = 'value2' 
where member.ClientUID is null 
0

Я думаю, что вы на самом деле довольно близки и просто должны соотнести не существующий подзапрос. Без выборочных данных я не тестировал, но думаю, что минимальная коррекция исправит ваш запрос.

SELECT A_CLIENT.ClientName 
    , A_CLIENT.ClientUID 
    , A_USER_DEFINED.LOB 
    FROM A_CLIENT 
     INNER JOIN 
     A_USER_DEFINED ON A_CLIENT.ClientUID = A_USER_DEFINED.ClientUID 
WHERE A_USER_DEFINED.LOB = 'value1' 
    AND NOT EXISTS (
        SELECT ClientUID 
        FROM A_GROUP_MEMBER 
        WHERE A_GROUP_MEMBER.ClientUID = A_CLIENT.ClientUID 
         AND GroupID = 'value2' 
       ) 

я бы, вероятно, использовать некоторые таблицы псевдоним ти сделать что легче читать, но YMMV:

SELECT c.ClientName 
    , c.ClientUID 
    , u.LOB 
    FROM A_CLIENT c 
     INNER JOIN 
     A_USER_DEFINED u ON c.ClientUID = u.ClientUID 
WHERE A_USER_DEFINED.LOB = 'value1' 
    AND NOT EXISTS (
        SELECT 1 
        FROM A_GROUP_MEMBER g 
        WHERE g.ClientUID = c.ClientUID 
         AND GroupID = 'value2' 
       ) 
Смежные вопросы