从排序查询中查找首选结果

时间:2014-01-16 16:59:14

标签: sql ms-access ms-access-2010

我有一个表,其中包含人员的地址信息(称为Address_Link),其中一个人可以拥有多个地址。 Address_Link具有以下某些字段:

  • ID(主键)
  • PersonID(包含该人信息的表的外键)
  • CountryID(包含国家/地区信息的表的外键)
  • STREET_ADDRESS

我正在构建的查询每个人只需要一个地址,但我的应用程序的用户关心哪个地址出现。实际上有一小部分首选国家 - 首先是加拿大,然后是英国,然后是其他所有国家。 (因此,如果有人有两个地址,一个在澳大利亚,一个在英国,则英国地址应该是出现的地址。)

目前,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中。有一个单独的表格可用于国家特定信息。

1 个答案:

答案 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表达式。

一旦您的查询版本工作,就会返回正确的SwitchPersonID组合,ID查询回INNER JOIN以仅选择匹配的行。