【问题标题】:SQL - updating a table using a stored procedureSQL - 使用存储过程更新表
【发布时间】:2014-01-21 20:35:00
【问题描述】:

我有一个邮政编码表和一个存储过程来计算 X 半径内的所有邮政编码,给定一个邮政编码和一个半径。

例如,要查找距离 10001 200 英里范围内的所有邮政编码,我会输入CALL zip(10001,200),它会显示每个邮政编码。

在新列“hradius”中,我希望在该行的邮政编码 200 英里范围内包含所有邮政编码。

我是 SQL 新手,感谢您的帮助。

【问题讨论】:

  • 您不想在一列中存储多个邮政编码,这是不必要的非规范化。
  • 什么风格的 SQL(Oracle、SQL Server、DB2、MySQL)?
  • 您打算如何将多个 ZipCode 存储在一个列中?
  • @user3182252 这是一个非常糟糕的设计,因为您无法利用 SQL 服务器的强大功能 - 您必须解析字符串......等等。请重新考虑你的努力。如果你想做这些预先计算的东西,你应该在数据库中创建这些行而不是列。 Zipcode、contiguousZip 等。无论哪种方式,您都在处理已解决的问题。
  • 是一个学习SQL的好项目。首先要学习的是不要在一个字段中存储多个值。创建一个相关的表来加入。

标签: sql sql-server stored-procedures


【解决方案1】:

不要将具有多个值的字符串塞入一个字段。创建一个相关表以将一个邮政编码链接到多个:

ZipOrigin   ZipDest   Distance
12345       23456     150
12345       34567     175
...

(距离是可选的 - 例如,您可以使用它来查找任何半径内小于X 的所有邮政编码)

【讨论】:

  • 我想知道他从哪里测量,从拉链的中心到拉链的中心(毕竟他说的是半径)。例如,如果一个拉链的宽度为 420,它可能“看起来”像拉链超过 200 英里(从中心到中心),但拉链可能是连续的。
【解决方案2】:

在这种情况下,如果您想预先生成匹配列表,最好为匹配使用单独的表。您将有两张表:一张用于您的邮政编码,一张用于匹配。第二个表将有两列,一列用于源邮政编码,另一列用于 X 英里(在本例中为 200)内的匹配邮政编码。每场比赛将有一个单独的行。存储过程的结果应该输出到第二个表。完成后,您可以使用如下查询:

SELECT zip.zipcode, zipJoin.zipcode
FROM zipCodes zip
    INNER JOIN zipCodeMatches zipJoin
        ON zip.zipcode = zipJoin.sourceZipCode
WHERE zip.zipcode = @zip

您应该花一些时间了解正确的表格设计和规范化以及如何将表格连接在一起以帮助您理解这些概念。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多