希望有人可以帮助解决我目前遇到的问题。
我有一个设置表(基于州、市和县),其中设置中的 * 代表“全部”,否则它代表它所持有的特定值。我需要从与设置表连接的主表中提取数据,以便它只提取设置表中定义的人口。
状态 | 城市 | 县 |
---|---|---|
AZ | * | * |
CA | * | 洛杉矶 |
CA | 圣地亚哥 | * |
CA | 旧金山 | * |
CA | 圣莫尼卡 | * |
纽约 | * | * |
纽约 | * | 布朗克斯 |
纽约 | * | 国王 |
主表是“人员”表,其中包含州、市和县列以及实际人员位置值。我需要能够将其与设置表连接起来,以便它只提取适用的行,其中设置表中的 * 代表“全部”。状态将始终具有有效值并且永远不会 *
根据上面的设置表,查询应该拉
a)全部来自纽约州和亚利桑那州(因为城市和县都有*)
b) 来自加利福尼亚州 - 全部属于圣地亚哥、旧金山和圣莫尼卡市,并且全部属于洛杉矶县。
我在当前查询中收到重复项(如下)。我尝试了一些选项,例如在最终查询中使用不同的值来清除重复项或查看数据中可以使用的其他内容。
SELECT
e.emplid,
e.first_name,
e.last_name ,
e.state,
e.county,
e.city
FROM
person e
JOIN setup S
ON e.state = S.State
AND (e.city = S.city OR S.city = '*')
AND (e.county = S.county OR S.county = '*')
AND sysdate between S.eff_dt and S.end_eff_dt
WHERE
sysdate between e.eff_dt and e.end_eff_dt
AND e.hr_Status <> 'T'
AND e.STAFF = 'N'
And e.union = 'NU'
AND e.country = 'USA';
存在重复项是因为 setup 表具有重叠的自然范围,并且您的联接语法允许在 multiple 设置记录上进行匹配。
为了解释,请重点关注此设置数据:
状态 | 城市 | 县 |
---|---|---|
纽约 | * | * |
纽约 | * | 布朗克斯 |
纽约 | * | 国王 |
第一行 NY 表示要匹配 NY 中的 Any city 和 Any county。但如果你有一个人也来自Kings,那么他们的记录将匹配2个设置行。
使用
DISTINCT
是一种可能的解决方案,但如果您扩展记录以包含 Setup
表中的匹配列,则该解决方案不起作用。以下应该有效
SELECT DISTINCT e.emplid, e.first_name, e.last_name, e.city, e.county, e.state
FROM
person e
JOIN setup S
ON e.state = S.State
AND (e.city = S.city OR S.city = '*')
AND (e.county = S.county OR S.county = '*')
在应用程序设计中,您可能会选择务实并进行检查以防止用户创建多个重叠标准,以便您可以避免
,但是美国城市合法地跨越多个县,因此执行更清洁的数据可能比它更努力值得。DISTINCT
另一种方法是使用
EXISTS
而不是加入,如果您不需要引用 Setup
中匹配的特定记录,这尤其有用。
SELECT e.EmplId, e.Name, e.State, e.City, e.County
FROM
person e
WHERE EXISTS (SELECT 1 FROM setup S
WHERE e.state = S.State
AND (e.city = S.city OR S.city = '*')
AND (e.county = S.county OR S.county = '*')
)