Мне нужно выбрать один столбец для каждой подходящей строки в другой таблице. Звучит просто, но есть поворот.
- У меня есть одна таблица с идентификаторами компаний и определения компаний.
- У меня есть еще одна таблица, которая определяет отделы в этих компаниях.
- У меня есть третья таблица, в которой содержатся различные коды состояния отдела.
Код, который у меня ниже, прекрасно работает, и это именно то, чего я хочу. Но я должен жестко указать в запросе, какие отделы искать. Я бы хотел, чтобы он выбирал на основе кодов отделов, которые он находит в таблице «Отделы», и не требовал, чтобы я жестко кодировал каждый возможный отдел, который может существовать в этой компании.
Мне нужно выбрать соответствующий отделстатус от DepartmentStatus, основанный на том, какие отделы существуют для компании, как определено в таблице DepartmentsStatus.
Я подозреваю, что это сводная таблица, но они немного выше моего уровня.
(Таблица компании)
Company_ID Company_Name
-------------------------
1 Home Office
2 Stanton Office
3 NYC Office
(таблица отделов)
CompanyID Department_Code
----------------------------
1 Sales
1 Inventory
1 Retail
1 Maint
2 OtherDept
2 ThatDept
2 BobsDept
(таблица DepartmentStatus)
Company_ID Department StatusCode
-----------------------------------------
1 Sales InReview
1 Inventory InReview
1 Retail Ready
1 Maint Done
2 OtherDept InReview
2 ThatDept Research
2 BobsDept InReview
Примечание: я использую «TOP 1», хотя естьуникальный индекс для Company_ID + Department, поэтому никогда не будет более одной подходящей строки.
Итак, для Company_ID = 1:
select Company_ID,
(select top 1 StatusCode from DepartmentStatus ds where ds.Company_ID = cm.Company_ID and ds.Department='Sales') as SalesStatus
(select top 1 StatusCode from DepartmentStatus ds where ds.Company_ID = cm.Company_ID and ds.Department='Inventory') as InvStatus
(select top 1 StatusCode from DepartmentStatus ds where ds.Company_ID = cm.Company_ID and ds.Department='Retail') as RetailStatus
(select top 1 StatusCode from DepartmentStatus ds where ds.Company_ID = cm.Company_ID and ds.Department='Main') as MaintStatus
from Company cm
Where cm.CompanyID=1
Результаты:
Company_ID SalesStatus InvStatus RetailStatus MaintStatus
--------------- --------------- ---------- ------------- ------------
1 InReview InReview Ready Done
Или, для CompanyID = 2:
select Company_ID,
(select top 1 StatusCode from DepartmentStatus ds where ds.CompanyID = cm.Company_ID and ds.Department='OtherDept') as OtherDeptStatus
(select top 1 StatusCode from DepartmentStatus ds where ds.CompanyID = cm.Company_ID and ds.Department='ThatDept') as ThatDeptStatus
(select top 1 StatusCode from DepartmentStatus ds where ds.CompanyID = cm.Company_ID and ds.Department='BobsDept') as BobsDeptStatus
from Company cm
Where cm.CompanyID=2
Результаты:
Company_ID OtherDeptStatus ThatDeptStatus BobsDeptStatus
---------- ---------------- -------------- --------------
2 InReview Research InReview
Таким образом, для компании 1 мне нужно получить статус отдела продаж, инвентарь, Розничная торговля и Maint. Но для Компании 2 мне нужно получить статус для Отделов OtherDept, ThatDept и BobsDept.
Шаги, которые, я думаю, описывают то, что я пытаюсь сделать, это:
- Получитьсписок отделов для компании 1 из таблицы отделов.
- Для каждого из этих отделов на шаге 1 запрос таблицы DepartmentStatus для Department равен этому отделу. Для компании 1 запрос получить код состояния Status для отделов «Sales, Inventory, Retail и Maint». Для компании 2 запрос получить код состояния Status для отделов «OtherDept, thatDept и BobsDept». и т. д. и т. д.
Проблема в том, что я не знаю заранее (во время запроса), какие отделы существуют для каждой компании, поэтому мне нужно выбрать дополнительный, основываясь на том, какие отделы существуют для каждой компании. .
Уже есть несколько других ответов SO, которые близки к тому, что я прошу, предлагая использовать JOIN для достижения этой цели, однако все они предполагают, что вы знаете значения, которые хотите запросить заранее. времени при написании оператора соединения.
Я ищу решение этой проблемы, а не просто исправление моей текущей попытки. Если бы у вас была лучшая идея о том, как этого добиться, я бы хотел это увидеть.