Фильтрация данных из двух или более таблиц в SQL Server 2008

У меня есть несколько таблиц:

  1. Таблица «DCDetails», которая содержит основные данные для нескольких диагностических центров.
  2. Таблица «CompanyDetails», которая содержит основные данные для компаний.
  3. Таблица «Расследование», в которой содержатся исследования (что означает набор медицинских тестов)

Это мои мастер-таблицы.

У меня также есть несколько таблиц отображения: 1. Таблица «КомпанияDCMap», которая содержит КАРТОЧКУ компании для диагностических центров 2. Таблица «РасследованиеDCMap», в которой содержится МАРКИРОВАНИЕ исследования для диагностических центров (или DC для краткости)

Я должен отфильтровать набор DC на основе двух критериев, которые:

  1. DC принадлежит к «CompanyDCMap» и
  2. Из DC, отфильтрованного в (1), он также входит в таблицу «InvestigationDCMap».

Как написать запрос для этого, так что я получаю DC, которые находятся как в CompanyDCMap, так и в InvestigationDCMap, поскольку у меня есть первичные ключи таблиц «CompanyDetails» и «Investigation».

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

Пожалуйста, помогите мне.

UPDATE Schema: CompanyDetails table:

CompanyID(PRIMARY KEY), CompanyName(NVARCHAR(100))
   1                     Company1
   2                     Company2
   3                     Company3

Таблица расследований:

InvestigationID(Primary key) , InvestigationName(NVARCHAR(100))
   1                               HIV+ Blood Test
   2                               TMT
   3                               Urine Test

Таблица DCDetails:

DCID(PRIMARY KEY), DCName(NVARCHAR(100))
   1                 DC1
   2                 DC2
   3                 DC3

Стол компанииDCMap

   CompanyDCMapID(Primary key), CompanyID(Foreign key), DCId(Foreign Key)
          1                        1                       1
          2                        1                       2
          3                        2                       2
          4                        2                       3
          5                        3                       1
          6                        3                       3

Таблица расчётов DCMap

  InvestigationDCMapID(Primary Key), InvestigationID(Foreign Key), DCId(Foreign Key)
          1                                1                           1
          2                                1                           3
          3                                2                           2
          4                                2                           3

Ожидаемый результат запроса, заданного CompanyID = 1 и InvestIDID = 2, SELECT DCId и DCName =

     DCId(Int)                   DCName(NVARCHAR(100))
      2                          DC2
0
nl ja de
@AaronBertrand там, я представил схему, некоторые детали и ожидаемый результат
добавлено автор Aniket Inge, источник

1 ответы

SELECT d.DCID, d.DCName
FROM dbo.DCDetails AS d
INNER JOIN dbo.CompanyDCMap AS c
ON d.DCID = c.DCId
INNER JOIN dbo.InvestigationDCMap AS i
ON i.DCId = d.DCID;

Чтобы получить «отличные» значения, вы можете использовать:

SELECT DISTINCT d.DCID, d.DCName
FROM dbo.DCDetails AS d
INNER JOIN dbo.CompanyDCMap AS c
ON d.DCID = c.DCId
INNER JOIN dbo.InvestigationDCMap AS i
ON i.DCId = d.DCID;

Или...

SELECT d.DCID, d.DCName
FROM dbo.DCDetails AS d
INNER JOIN dbo.CompanyDCMap AS c
ON d.DCID = c.DCId
INNER JOIN dbo.InvestigationDCMap AS i
ON i.DCId = d.DCID
GROUP BY d.DCID, d.DCName;

Еще лучше, поскольку не требуется никаких связей с другими таблицами:

SELECT d.DCID, d.DCName
FROM dbo.DCDetails AS d
WHERE EXISTS (SELECT 1 FROM dbo.CompanyDCMap WHERE DCId = d.DCID)
AND EXISTS (SELECT 1 FROM dbo.InvestigationDCMap WHERE DCId = d.DCID);

Это будет гораздо более эффективный запрос, но если вам нужны другие столбцы из других таблиц, вам нужно вернуться к версии соединения.

4
добавлено
Можете ли вы объяснить мне, как это работает? Так как это работает! :-)
добавлено автор Aniket Inge, источник
Кроме того, я могу использовать SELECT DISTINCT , чтобы выбрать самые разные значения
добавлено автор Aniket Inge, источник
это первичный ключ, но когда я запускал запрос на своем тестовом sql-сервере, я столкнулся с повторяющимися значениями, они, вероятно, исходили из выражения join
добавлено автор Aniket Inge, источник
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

dbGeeks
dbGeeks
545 участник(ов)

Чат про базы данных, их устройство и приемы работы с ними. Разрешаются любые адеватные дискуссии в рамках тематики чата.

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)

Разработка СУБД
Разработка СУБД
143 участник(ов)