2016-10-04 2 views
0

Мне нужно вернуть все записи из NetworkDomain, где ни одна из этих сетей еще не была назначена определенной организации (в этом случае OrgName1). Итак, в приведенном ниже примере, если я хочу вернуть все сети, которые не были назначены OrgName1 (для чего результат должен быть NetName2 и NetName3), как мне это сделать? ПРИМЕЧАНИЕ: Мне нужно сети заказываются AscВозвращает записи из таблицы, где они не были использованы в другой таблице, 3 таблицы

Таблица Name = "BusinessOrganizationDomain"

|---------------------|------------------| 
|  OrgUUID  |  OrgName  | 
|---------------------|------------------| 
|   1111  |  OrgName1 | 
|---------------------|------------------| 
|   2222  |  OrgName2 | 
|---------------------|------------------| 

Table Name = "BusinessOrganizationAuthorizedNetwork"

|  OrgUUID  |  NetUUID  | 
|---------------------|------------------| 
|   1111  |  5555  | 
|---------------------|------------------| 
|   2222  |  6666  | 
|---------------------|------------------| 

Table Name = "NetworkDomain"

|  NetUUID  |  NetName  | 
|---------------------|------------------| 
|   5555  |  NetName1 | 
|---------------------|------------------| 
|   6666  |  NetName2 | 
|---------------------|------------------| 
|   7777  |  NetName3 | 
|---------------------|------------------| 
+0

Просто LEFT JOIN, чтобы получить необходимые выходные я имею в виду, если какой-либо из них не назначен. –

+0

слева объединяют результаты с нулевыми записями, когда совпадений нет, так что левое объединение и WHERE NetName IS NULL или некоторые из них. – Will

+0

Я попытался сформулировать левое соединение на этих трех таблицах и не понял этого. Извините, я новичок в SQL. Я знаю, как оставить соединение и установить NULL с 2 таблицами, но не вышеприведенный случай для 3 таблиц. –

ответ

1

Одним из способов является НЕ СУЩЕСТВУЕТ предиката

SELECT * FROM NetworkDomain nd 
WHERE NOT EXISTS (
    SELECT 1 
    FROM BusinessOrganizationAuthorizedNetwork bn 
    INNER JOIN BusinessOrganizationDomain bd 
    ON bd.OrgUUID = bn.orgUUID AND bn.NetUUID = nd.NetUUID AND bd.OrgName = 'OrgName1' 
) 
0

Попробуйте это. Не уверен, что вы пытаетесь выбрать организацию на основе имени или идентификатора, так что вот и все.

По названию:

SELECT DISTINCT nd.* FROM NetworkDomain nd 
LEFT JOIN BusinessOrganizationAuthorizedNetwork boan ON boan.NetUUID = nd.NetUUID 
LEFT JOIN BusinessOrganizationDomain bod ON bod.OrgUUID = boan.OrgUUID 
WHERE bod.OrgName IS NULL 
ORDER BY nd.NetName 
+0

Вышеуказанное вернет авторизованных пользователей, которых я предполагаю. OP хотел, чтобы имена не были назначены. –

+0

* «Итак, в приведенном ниже примере, если я хочу вернуть все сети, которые не были назначены для OrgName1» * - Имена, которые не были назначены «OrgName1», а не имена, которые не были назначены вообще, недоразумение? – Santi

+0

Я, возможно, назвал это неправильным. Я хочу вернуть сети, которые не были назначены вообще. Можете ли вы отредактировать, чтобы разместить это? –

0

попробовать это, это поможет.

Сортировать по сетевое_имя

select nd.NetName 
from 
BusinessOrganizationDomain bod inner join 
BusinessOrganizationAuthorizedNetwork boan 
on boan.OrgUUID = bod.OrgUUID 
inner join 
NetworkDomain nd 
on nd.NetUUID != boan.NetUUID 
where bod.OrgName='OrgName1' 
ORDER by nd.NetName 

Заказ по NetUUID

select nd.NetName 
from 
BusinessOrganizationDomain bod inner join 
BusinessOrganizationAuthorizedNetwork boan 
on boan.OrgUUID = bod.OrgUUID 
inner join 
NetworkDomain nd 
on nd.NetUUID != boan.NetUUID 
where bod.OrgName='OrgName1' 
ORDER by nd.NetUUID 
+0

Это сработало, но ТОЛЬКО, когда в организации было 1 сеть. Если моя организация содержала 2 сети, ваш запрос возвращал повторяющиеся записи для не совпадений и возвращал 1 запись для совпадений –

 Смежные вопросы

  • Нет связанных вопросов^_^