#sql #sql-server
#sql #sql-сервер
Вопрос:
Мне нужно вернуть все записи из NetworkDomain, где какая-либо из этих сетей еще не была назначена определенной организации (в данном случае OrgName1). Итак, в приведенном ниже примере, если я хочу вернуть все сети, которые не были назначены OrgName1 (в результате чего должны быть NetName2 и NetName3), как мне это сделать? ПРИМЕЧАНИЕ: мне нужно, чтобы сети были упорядочены по ASC
Имя таблицы = «BusinessOrganizationDomain»
|---------------------|------------------|
| OrgUUID | OrgName |
|---------------------|------------------|
| 1111 | OrgName1 |
|---------------------|------------------|
| 2222 | OrgName2 |
|---------------------|------------------|
Имя таблицы = «BusinessOrganizationAuthorizedNetwork»
| OrgUUID | NetUUID |
|---------------------|------------------|
| 1111 | 5555 |
|---------------------|------------------|
| 2222 | 6666 |
|---------------------|------------------|
Имя таблицы = «NetworkDomain»
| NetUUID | NetName |
|---------------------|------------------|
| 5555 | NetName1 |
|---------------------|------------------|
| 6666 | NetName2 |
|---------------------|------------------|
| 7777 | NetName3 |
|---------------------|------------------|
Комментарии:
1. Просто ЛЕВОЕ СОЕДИНЕНИЕ, чтобы получить требуемый результат, я имею в виду, если какой-либо из них не назначен.
2. левое соединение приводит к нулевым записям, когда совпадений нет, поэтому выполните левое соединение и ГДЕ NetName РАВНО NULL или что-то подобное.
3. Я попытался сформулировать левое соединение для этих 3 таблиц и не понял этого. Извините, я новичок в SQL. Я знаю, как соединить слева и указать значение NULL с 2 таблицами, но не в приведенном выше случае для 3 таблиц
Ответ №1:
Одним из способов является предикат NOT EXISTS
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'
)
Ответ №2:
попробуйте это, это поможет.
Порядок по NetName
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
Комментарии:
1. Это работало, но ТОЛЬКО когда организация содержала 1 сеть. Если в моей организации было 2 сети, ваш запрос возвращал повторяющиеся записи для не совпадений и возвращал 1 запись для совпадений
Ответ №3:
Попробуйте это. Не уверен, пытаетесь ли вы выбрать организацию на основе имени или идентификатора, так что вот и то, и другое.
По имени:
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
Комментарии:
1. Я полагаю, что приведенное выше вернет авторизованных пользователей. OP хотел, чтобы имена им не были назначены.
2. «Итак, в приведенном ниже примере, если я хочу вернуть все сети, которые не были назначены OrgName1» — имена, которым не были назначены
OrgName1
, а не имена, которые вообще не были назначены, если я не недопонимаю?3. Возможно, я неправильно сформулировал это. Я хочу вернуть сети, которые вообще не были назначены. Можете ли вы отредактировать, чтобы учесть это?
4. Вы приближаетесь. Это привело ко всем не назначенным сетевым точкам. Однако мне нужно указать название организации. Должны быть возвращены все сети, кроме тех, которые назначены для ‘insertorganizationnamehere’
5. Я чувствую, что вы дали мне противоречивую информацию. Первый запрос, который я вернул, вернул все сети, кроме назначенных
name here
, включая неназначенные. Затем вы сказали мне, что вам нужны только неназначенные имена. По сути, вы просите меня вернуться к тому, что у меня было изначально. Можете ли вы уточнить?