我有一个具有不同地理分辨率的映射表。用户将数据输入到表中,我试图将数据表连接到映射表,条件是如果您可以加入zipcode值,那么如果zip不可用则加入,然后加入城市。
是否可以在联接中执行此操作?
答案 0 :(得分:0)
我想在你的where子句中使用这样的东西:
WHERE a.ZipCode = ISNULL(b.ZipCode,a.ZipCode) AND a.City = ISNULL(b.City,a.City)
答案 1 :(得分:0)
根据您的数据,您可以在JOIN子句中使用OR
SELECT *
FROM a
JOIN b
ON a.Zip = b.Zip
OR a.City = b.City
或将两个查询结合在一起
SELECT *
FROM a
JOIN b
ON a.Zip = b.Zip
UNION
SELECT *
FROM a
JOIN b
ON a.City = b.City
AND a.Zip <> b.Zip
答案 2 :(得分:0)
WHERE (a.ZipCode IS NOT NULL AND b.ZipCode IS NOT NULL AND a.ZipCode = b.ZipCode)
OR (a.ZipCode IS NULL OR b.ZipCode IS NULL) AND a.City = b.City
让我们分解一下:
(a.ZipCode IS NOT NULL AND b.ZipCode IS NOT NULL AND a.ZipCode = b.ZipCode)
首先,我们需要确保zipcode都不是NULL(未知) 如果我们有2个zipcode,我们可以比较它们,如果没有,我们想比较城市:
OR (a.ZipCode IS NULL OR b.ZipCode IS NULL) AND a.City = b.City
这里我们确保至少有一个zipcodes为NULL(未知),否则我们更愿意比较zipcodes。然后我们比较城市。
您可以跳过第二部分中的NULL检查,并将where子句简化为:
WHERE (a.ZipCode IS NOT NULL AND b.ZipCode IS NOT NULL AND a.ZipCode = b.ZipCode)
OR a.City = b.City
但是在这种情况下,它不会优先在城市上匹配ZipCode,例如:如果我们有一个ZipCode:1000和Name:Test的城市,另一个城市有ZipCode:2000,名称:Test .. it现在会认为它们是匹配的。
使用(INNER)JOIN时,在JOIN或WHERE子句中指定条件没有区别,所以这些:
SELECT ... FROM a JOIN b ON a.id=b.a_id
SELECT ... FROM a, b WHERE a.id=b.a_id
会产生相同的结果。