【问题标题】:can sql functions such as min() or max() destroy record integritysql函数如min()或max()会破坏记录完整性吗
【发布时间】:2010-07-23 00:53:15
【问题描述】:

诸如 Min() 或 Max() 之类的函数可能会破坏记录的完整性吗?以我最近编写的查询为例:

SELECT account, MIN(phone), MIN(chargeid), MIN(locationid) FROM import1 GROUP BY account, phone

我是否有可能无意中将我的字段数据混合到新记录中?如果我将 1 Min 更改为 Max 会怎样?如果我愿意,我可以破坏记录的完整性吗?

谢谢, 多诺万

【问题讨论】:

    标签: sql record integrity


    【解决方案1】:

    您实际上并没有更改该查询中的数据,您只是在选择或查看它。

    除非您执行 UPDATE、INSERT 或 DELETE 或调用存储过程,否则您不会更改数据。

    【讨论】:

    • 是的,但在这种情况下,选择正在变成一个全新的数据集。使用 visual fox 时,您可以将 select 语句变成一个全新的表,这就是我担心的原因。
    【解决方案2】:

    我不确定您所说的破坏记录完整性是什么意思,但调用 MIN 或 MAX 函数并没有错。这是一种非常常见的查询。

    您不应假设结果集中一行中的所有值都来自原始表中的同一行。这些值可以来自不同的行。例如,如果你表中的数据是这样的:

    账号电话chargeid locationid 123 456 10 30 123 456 40 20

    那么结果会是这样的:

    帐号电话 MIN(chargeid) MIN(locationid) 123 456 10 20

    “10”来自第一行,“20”来自第二行。

    另外,您在手机上使用 MIN 似乎没有必要。您应该只选择此字段,因为它是 group by 的一部分:

    SELECT account, phone, MIN(chargeid), MIN(locationid)
    FROM import1
    GROUP BY account, phone
    

    【讨论】:

    • 我想确保我没有将多行的字段与该选择混合。我正在根据该语句创建一个新表,并且我想确保它准确表示创建它的数据
    • 您在 Min(电话)上的权利,它以前不是分组的一部分,当我包含它时,我错过了删除 MIN。
    • @Donovan:您可能混合了不止一行的字段。请参阅我的更新答案,其中我举了一个例子。
    【解决方案3】:

    我相信他的问题是,如果存在以下数据

    Account Phone       ChargeId LocationId
    1       111-1111    6         8
    2       111-1111    7         7
    2       111-1111    8         6
    

    它会返回 2、111-1111、7、6(chargeId(2) 中的 7 和 LocationId(3) 中的 6)。

    如果这是您的要求,那么是的。它会破坏你的结果。

    【讨论】:

    • 这就是为什么我尝试使用使用 ROW_NUMBER() 建立的主键(来自您之前的问题)。您能否将数据推送到指定了 IDENTITY 列的新表中?
    • 粗鲁。这就是我所害怕的。
    • 是的。如果需要我可以。我可以临时修改表格以包含行号作为键。我无法将它包含在查询中,但我可以在运行 select 语句之前让表达到它具有唯一键的位置。
    猜你喜欢
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    相关资源
    最近更新 更多