T-SQL - 连接两个没有主键的表

时间:2012-09-25 17:05:38

标签: sql-server tsql join

我有2个表,代表2种不同的模型模拟。作为背景信息,2个模型试图模拟相同的事物,但是modelA试图表示非常具体的属性,而modelb试图模拟更广泛的范围。表A有n行,大于tableB中的m行。我正在尝试创建一个与表A具有相同行数(n)的表,在那里我可以看到哪个modelA_ID与modelB_IDs相关。

表A:

ModelA_ID  region height weight
1          1       25      7.1            
2          1       70      7.1            
3          1       10      7.2            
4          1       30      7.3
5          1       35      7.4
6          2       30      7.1

表B:

ModelB_ID  region min_height max_height min_weight max_weight
9001       1        0             50      7.1        7.3    
9002       1        51            100     7.1        7.3
9003       1        0             100     7.4        7.5
9004       2        0             100     7.1        7.5

所以在上面的例子中,我应该以

的方式结束
ModelA_ID  ModelB_ID    
1        9001            
2        9002            
3        9001            
4        9001      
5        9003     
6        9004

区域在两个表中都不是唯一的。如果我认为我会参与其中,那就像

那样
SELECT  TableA.ModelA_ID TableB.ModelB_ID 
FROM TableA
inner JOIN TableA
ON TableA.region =TableB.region
where 
TableA.height >= TableB.min_height
and TableA.height <= TableB.max_height
and TableA.weight >= TableB.min_weight
and TableA.weight <= TableB.max_weight

然而,区域不是唯一的密钥,所以我不能这样做!

几天前SQL新手,但来自cshell背景,但新工作只有sql策略: - (

有什么想法吗?它不是必须经常重复的,所以效率不是关键。

由于

1 个答案:

答案 0 :(得分:1)

  

然而,区域不是唯一的密钥,所以我不能这样做!

JOIN列不一定必须是各自表中的主键。

SELECT 
    TableA.ModelA_ID,
    TableB.ModelB_ID 
FROM 
    TableA
    JOIN TableB
    ON TableA.region = TableB.region
WHERE 
    TableA.height >= TableB.min_height
AND TableA.height <= TableB.max_height
AND TableA.weight >= TableB.min_weight
AND TableA.weight <= TableB.max_weight

以上查询的结果是:

ModelA_ID   ModelB_ID
----------- -----------
1           9001
3           9001
4           9001
2           9002
5           9003
6           9004

(6 row(s) affected)