我有一个表,其中包含人员的地址信息(称为Address_Link),其中一个人可以拥有多个地址。 Address_Link具有以下某些字段:
我正在构建的查询每个人只需要一个地址,但我的应用程序的用户关心哪个地址出现。实际上有一小部分首选国家 - 首先是加拿大,然后是英国,然后是其他所有国家。 (因此,如果有人有两个地址,一个在澳大利亚,一个在英国,则英国地址应该是出现的地址。)
目前,Access应用程序中有一个查询,它会对此表的内容进行排序和输出,以及一个“Sort_Value”列,该列在加拿大分配一个值为0,UK 1和其他所有人2的地址。
我正在处理的一些查询需要包含此首选项,但我无法使查询拉出正确的地址。有澳大利亚和英国的人会出现澳大利亚地址。我一直在使用“First”来拉取Street_Address,但这是不正确的。使用“Min”似乎也无法解决问题。
对于给定的PersonID,如何获取Access中Sort_Value列中值最小的地址条目?
(编辑)以下是运行的SQL,虽然速度很慢:
SELECT a.PersonID, b.CountryID
FROM Address_link AS a LEFT JOIN Countries AS b ON a.CountryID = b.ID
WHERE a.PersonID = (SELECT TOP 1 ID from Addresses_Sorted WHERE PersonID = a.PersonID)
ORDER BY a.PersonID;
国家/地区名称不存储在地址中,只存储在国家/地区ID中。有一个单独的表格可用于国家特定信息。
答案 0 :(得分:0)
你说Address_Link.PersonID
是包含该人信息的表的“外键。”我会假装其他表名为people_table
及其{{1}值在表格中是唯一的。
如果这是正确的,请从该表开始并使用相关子查询从每个PersonID
所需的行中检索Address_Link.ID
。
PersonID
我猜测SELECT
y.PersonID,
(
SELECT TOP 1 ID
FROM Address_Link
WHERE PersonID = y.PersonID
ORDER BY
Switch
(
CountryID = 'CA', 0,
CountryID = 'UK', 1,
True, 2
),
ID
) AS target_ID
FROM people_table AS y;
是文本数据类型。如果它实际上是数字,请修改CountryID
表达式。
一旦您的查询版本工作,就会返回正确的Switch
和PersonID
组合,ID
查询回INNER JOIN
以仅选择匹配的行。