如果您想避免进行大量连接,您应该能够使用游标和一些动态 SQL 来完成此操作。
这是一个示例(这是使用 MSSQL 语法编写的,但我认为它在 MySql 中不一样的话很接近):
CREATE TABLE #result
(table1Val varchar(50), table2Val varchar(50))
DECLARE @sql VARCHAR(MAX)
DECLARE @table1_val int, @table1_type varchar(50), @table2_val int, @table2_type varchar(50)
DECLARE cur CURSOR FOR
SELECT table1_id, table1_type, table2_id, table2_type
FROM A
OPEN cur
FETCH NEXT FROM Cur INTO @table1_val, @table1_type, @table2_val, @table2_type
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = '
INSERT INTO #result
(SELECT val FROM ' +CASE @table1_type WHEN 'B_Type' THEN 'B' WHEN 'C_type' THEN 'C' + ' WHERE id = '''+@table1_val+'''),
(SELECT val FROM ' +CASE @table2_type WHEN 'B_Type' THEN 'B' WHEN 'C_type' THEN 'C' + ' WHERE id = '''+@table2_val+''')
'
EXEC(@sql)
--use this instead to debug the dynamic query
--PRINT(@sql)
END
UPDATE @JoinResult
SET B_ID = SQ.ID,
B_Age = SQ.AGE,
B_Education = SQ.Education
FROM (
SELECT ID, AGE, EDUCATION
FROM TableB b
WHERE (
abs((SELECT A_Age FROM @JoinResult WHERE A_Id = @i) - AGE) <=2
AND abs((SELECT A_Education FROM @JoinResult WHERE A_Id = @i) - EDUCATION) <=2
) AND (SELECT B_ID FROM @JoinResults WHERE B_ID = b.id) IS NULL
) AS SQ
CLOSE cur
DEALLOCATE cur
SELECT #result
DROP TABLE #result