用多个SELECT替换INNER JOIN



我有一个Screening表,它包含许多筛选,主键是int。我还有6个其他表(LengthMeasurementWeightMeasurement等(,它们通过外键约束链接到Screening表。

为了获得筛选及其所有相关信息,我首先使用了一个INNER联接,如:

SELECT *
FROM [user].[Screening] scr                
INNER JOIN [user].[LengthMeasurement] lm ON scr.Id = lm.ScreeningId
INNER JOIN [user].[WeightMeasurement] wm ON scr.Id = wm.ScreeningId
INNER JOIN [user].[Note] n ON scr.Id = n.ScreeningId
INNER JOIN [user].[IntakeRegistration] ir ON scr.Id = ir.ScreeningId
INNER JOIN [user].[RiskProfile] rfr ON scr.Id = rfr.ScreeningId
INNER JOIN [user].[OncologyTasteAnamnesis] ota ON scr.Id = ota.ScreeningId
WHERE scr.UserId = 2

然而,即使只有少量的数据,这也需要大约2秒的时间,并获得超过30000行(笛卡尔乘积(。

如果我也这样做,但这次只使用简单的SELECTS,比如:

SELECT * FROM [user].[Screening] scr WHERE UserId = 2  
SELECT * FROM [user].[LengthMeasurement] WHERE [ScreeningId] IN
(
SELECT Id FROM [user].[Screening]
WHERE UserId = 2
)
SELECT * FROM [user].[WeightMeasurement] WHERE [ScreeningId] IN
(
SELECT Id FROM [user].[Screening]
WHERE UserId = 2
)
SELECT * FROM [user].[Note] WHERE [ScreeningId] IN
(
SELECT Id FROM [user].[Screening]
WHERE UserId = 2
)
SELECT * FROM [user].[IntakeRegistration] WHERE [ScreeningId] IN
(
SELECT Id FROM [user].[Screening]
WHERE UserId = 2
)
SELECT * FROM [user].[RiskProfile] WHERE [ScreeningId] IN
(
SELECT Id FROM [user].[Screening]
WHERE UserId = 2
)
SELECT * FROM [user].[OncologyTasteAnamnesis] WHERE [ScreeningId] IN
(
SELECT Id FROM [user].[Screening]
WHERE UserId = 2
)

像这样只需要几毫秒,我只检索所需的行(35(。

很明显,第二种方式是禁食的,但我想知道这是否真的是个好主意,也许还有其他解决方案可以让这个简单的查询快速?

您正在沿着不同的维度进行连接,这将为单个用户生成笛卡尔乘积。

很明显,INNER JOIN不会返回合理的结果集,因为您得到的行比您需要的要多得多。

如果单独的查询满足您的需求,那么这绝对是一个可行的选择。使用UNION ALL不能很容易地将它们组合成一个查询,因为列(很可能(非常不同。

否则,您需要决定您实际想要的结果集。然后,您可以具体询问如何返回。

最新更新