SQL вызывает у меня головную боль - несколько соединений - PullRequest
2 голосов
/ 30 ноября 2010

Сначала я объясню свой сценарий. Вот 2 общие таблицы:

Счета:

LegacyID = Идентификатор счет

InvoiceAccount = Учетная запись может иметь несколько субсчетов в одном Таблица. Это поле является LegacyID его родительского счета

Клиент = Может быть два разных типы учетных записей, и они могут поделиться Идентификаторы - таким образом, этот столбец различает между 2. Для целей моего SQL Я всегда хочу, чтобы это было правдой, а чем ложь

AllocatedUser = Имя пользователя человек, которому нужно это увидеть поставки. Это только на родительский аккаунт, поэтому мне нужно связать назад, чтобы получить это для субсчетов

Доставка:

LegacyID = Идентификатор доставки

Клиент = LegacyID учетной записи связанных с доставкой (может быть субсчет)

OnHold = флаг, который для целей моего запроса должно быть 'true'

Теперь это объяснено, в основном мне нужен SQL, который возвращает любые доставки, которые 'OnHold', но только для доставок для учетных записей, которые выделены вошедшему в систему пользователю. Запрос на выбор AllocatedUser, если ссылки доставки на родительский аккаунт, был простым, но у меня возникают проблемы с возвратом строк, если доставка связана с субсчетом - он просто не возвращает никаких. Вот SQL ниже:

SELECT     Deliveries_1.LegacyID, Deliveries_1.TripDate, Deliveries_1.OnHoldReason, Account_2.AllocatedUser
FROM         Deliveries AS Deliveries_1 INNER JOIN
                      Account AS Account_1 ON Deliveries_1.Customer = Account_1.InvoiceAccount INNER JOIN
                      Account AS Account_2 ON Account_1.InvoiceAccount = Account_2.LegacyID
WHERE     (Deliveries_1.OnHold = @OnHold) AND (Account_2.Customer = 'True') AND (Account_2.AllocatedUser = @AllocatedUser)

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 30 ноября 2010

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

SELECT DISTINCT d.LegacyID, d.TripDate, d.OnHoldReason,
       case
          when child.LegacyID = d.Customer then child.AllocatedUser
          when parent.LegacyID = d.Customer then parent.AllocatedUser
          else this.AllocatedUser
       end as 'Delivery_AllocatedUser'
FROM Account this
  LEFT JOIN Account parent on parent.LegacyID = this.InvoiceAccount
  LEFT JOIN Account child on this.LegacyID = child.InvoiceAccount
  JOIN Deliveries d on (d.Customer = this.LegacyID AND this.Customer = 'True')
                    OR (d.Customer = parent.LegacyID AND parent.Customer = 'True')
                    OR (d.Customer = child.LegacyID AND child.Customer = 'True')
WHERE d.OnHold = @OnHold
  AND this.AllocatedUser = @AllocatedUser
0 голосов
/ 30 ноября 2010
 ON Deliveries_1.Customer = Account_1.InvoiceAccount
 ON Account_1.InvoiceAccount = Account_2.LegacyID 

Если оба эти критерия верны, то Delivery.Customer будет равен Account2.LegacyId (доставка должна быть на родительском счете)Я не думаю, что это то, что вы хотели.

Возможно, вы имели в виду

 ON Deliveries_1.Customer = Account_1.LegacyID
 ON Account_1.InvoiceAccount = Account_2.LegacyID 
0 голосов
/ 30 ноября 2010

Первый комментарий заключается в том, что вы должны создавать объединения поэтапно, если у вас есть проблемы.

Второй комментарий заключается в том, что в отправленном вами запросе есть ненужное объединение - вы не фильтруете, не выбираете и не объединяете что-либоспецифично для таблицы с псевдонимом Account_1.

Возможно, это указывает на то, что вы делаете неправильно.В противном случае запрос выглядит (!) Нормально (при условии, что все объединения верны; ваши описания не точны - например, для Accounts. Клиент говорит, что «В целях моего SQL я всегда хочу, чтобы он был верным, а не ложным»).'- ну, Заказчик не является истинным / ложным, не так ли? Что вы имеете в виду? Существуют и другие подобные несоответствия ...)

Некоторые данные выборки и образец результата могут пролить немного света.

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