【问题标题】:Query a single value from a column that pulls multiple values从提取多个值的列中查询单个值
【发布时间】:2010-09-17 14:24:04
【问题描述】:

使用以下查询:

    SELECT pe.prodtree_element_name_l, MAX(rs.resource_value) AS resource_value
    FROM prodtree_element pe
    LEFT JOIN resource_shortstrings rs
        ON pe.prodtree_element_name_l_rk = rs.resource_key
    WHERE rs.language_id = '5'
        AND pe.prodtree_element_name_l <> ''
    GROUP BY prodtree_element_name_l

我试图弄清楚如何获取任何“resource_value”。问题是虽然这适用于许多其他查询,但我有一个使用 ntext 数据类型而不是 varchars 的特定表(它不能利用 MAX 函数)。所以基本上,MAX在这里不起作用。我可以在 MS SQL Server 2005 上使用替代品吗?

我需要对 prodtree_element_name_l 列进行分组,但我只需要 resource_value 列中的一个值,而且我不在乎它是什么,因为它们中的大多数都是相同的(尽管有些不是,因此我不能将它分组一个)。

更新:

哎呀,我错了,prodtree_element_name_l 也是一个 NTEXT。这可能会有所帮助:p

【问题讨论】:

    标签: sql function


    【解决方案1】:

    这将获得第一个随机条目

    SELECT DISTINCT 
         pe.prodtree_element_name_l, 
        (SELECT TOP 1 rs2.resource_value
        FROM resource_shortstrings rs2
        WHERE rs2.language_id = '5'
          AND rs2.resource_key = pe.prodtree_element_name_l_rk) AS "resource_value"
    FROM prodtree_element pe
    LEFT JOIN resource_shortstrings rs
        ON pe.prodtree_element_name_l_rk = rs.resource_key
    WHERE rs.language_id = '5'
        AND pe.prodtree_element_name_l IS NOT NULL
    --GROUP BY prodtree_element_name_l
    

    注意

    在您的查询中,您使用了 LEFT JOIN,但也使用了左连接表上的过滤器,因此限制了记录集。我把它留在原地,因为我认为它会改变你的结果......但是做 LEFT JOIN 没有意义。

    编辑

    根据 cmets 中的反馈,我将 group by 注释掉并切换到了 distinct

    【讨论】:

    • 我得到了和上次一样的结果(不兼容的数据类型)。
    【解决方案2】:

    我收到了错误:

    The data types ntext and varchar are incompatible in the not equal to operator.
    

    除非我错过了什么?

    编辑:检查顶部。

    【讨论】:

    • pe.prodtree_element_name_l 也是 NTEXT 吗?如果是这样,您可能需要在不等于条件的行上进行 CAST。
    • 不,prodtree_element_name_l 是 NVARCHAR,资源值是唯一的 NTEXT
    • 尝试在 行上添加强制转换,现在得到了:聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且列被聚合是一个外部引用。
    • 你有没有从下面尝试我的修改版本?
    • 我现在有,那个错误是我原来的错误:列 'resource_shortstrings.resource_key' 在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。
    【解决方案3】:
      SELECT pe.prodtree_element_name_l, MAX(CAST(rs.resource_value AS NVARCHAR(MAX))) AS resource_value
        FROM prodtree_element pe
        LEFT JOIN resource_shortstrings rs
            ON pe.prodtree_element_name_l_rk = rs.resource_key
        WHERE rs.language_id = '5'
            AND pe.prodtree_element_name_l <> ''
        GROUP BY prodtree_element_name_l
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2012-09-15
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多