1

我有几张桌子:

  1. “DCDetails”表包含一些诊断中心的主数据。
  2. 包含公司主数据的“CompanyDetails”表
  3. 包含调查的“调查”表(意味着要进行的一组医学测试)

这些是我的主桌。

我还有一些映射表: 1.“CompanyDCMap”表,其中包含公司到诊断中心的映射 2.“InvestigationDCMap”表,其中包含调查到诊断中心(或简称 DC)的映射

我必须根据以下两个标准过滤一组 DC:

  1. DC 属于“CompanyDCMap”并且
  2. 在 (1) 中过滤的 DC 中,它也属于“InvestigationDCMap”表。

鉴于我有“CompanyDetails”和“Investigation”表的主键,我如何为此编写查询,以便获得位于 CompanyDCMap 和 InvestigationDCMap 中的 DC。

我几乎放弃了,我想不出同时过滤两组的查询。

请帮助我。

更新 架构:CompanyDetails 表:

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

DC明细表:

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 和 InvestigationID = 2、SELECT DCId 和 DCName = 的查询的预期输出

     DCId(Int)                   DCName(NVARCHAR(100))
      2                          DC2
4

1 回答 1

4
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);

这将是一个更有效的查询,但如果您需要其他表中的其他列,则需要恢复到联接版本。

于 2013-01-09T18:19:40.603 回答