14

补充:使用 SQL Server 2000 和 2005,因此必须同时在两者上工作。此外,value_rk 不是数字/整数(错误:操作数数据类型唯一标识符对 min 运算符无效)

当我不关心返回的其他列时,有没有办法进行单列“DISTINCT”匹配?例子:

**Table**
Value A, Value L, Value P
Value A, Value Q, Value Z

我只需要根据第一行(值 A)中的内容返回其中一个行。我仍然需要第二列和第三列的结果(无论如何,第二列实际上应该完全匹配,但第三列是唯一键,我至少需要其中一个)。

这是我到目前为止所得到的,尽管它显然不起作用:

SELECT value, attribute_definition_id, value_rk
FROM attribute_values
WHERE value IN (
    SELECT value, max(value_rk)
    FROM attribute_values
)
ORDER BY attribute_definition_id

我在 ColdFusion 工作,所以如果有一个简单的解决方法,我也愿意接受。我试图限制或“分组”第一列“值”。value_rk 是我的大问题,因为每个值都是唯一的,但我只需要一个。

注意: value_rk 不是数字,因此这不起作用

更新:我有一个工作版本,它可能比纯 SQL 版本慢很多,但老实说,在这一点上任何工作都比没有好。它从第一个查询中获取结果,执行第二个查询,除了将结果限制为一个,并为匹配的值获取匹配的 value_rk。像这样:

<cfquery name="queryBaseValues" datasource="XXX" timeout="999">
    SELECT DISTINCT value, attribute_definition_id
    FROM attribute_values
    ORDER BY attribute_definition_id
</cfquery>

<cfoutput query="queryBaseValues">
    <cfquery name="queryRKValue" datasource="XXX">
        SELECT TOP 1 value_rk
        FROM attribute_values
        WHERE value = '#queryBaseValues.value#'
    </cfquery>
    <cfset resourceKey = queryRKValue.value_rk>
    ...

所以你有了它,在 ColdFusion 中明确地选择了一个列。仍然非常欢迎任何纯 SQL Server 2000/2005 建议:)

4

11 回答 11

11

这可能有效:

SELECT DISTINCT a.value, a.attribute_definition_id, 
  (SELECT TOP 1 value_rk FROM attribute_values WHERE value = a.value) as value_rk
FROM attribute_values as a
ORDER BY attribute_definition_id

..未测试。

于 2008-10-30T21:32:46.813 回答
9
SELECT a1.value, a1.attribute_definition_id, a1.value_rk
FROM attribute_values AS a1
  LEFT OUTER JOIN attribute_values AS a2
    ON (a1.value = a2.value AND a1.value_rk < a2.value_rk)
WHERE a2.value IS NULL
ORDER BY a1.attribute_definition_id;

换句话说,找到不存在具有相同和更大的a1a2valuevalue_rk

于 2008-10-30T18:51:55.640 回答
8

这应该适用于 PostgreSQL,我不知道你使用哪个 dbms。

SELECT DISTINCT ON (value)
  value, 
  attribute_definition_id, 
  value_rk
FROM 
  attribute_values
ORDER BY
  value, 
  attribute_definition_id

PostgreSQL 文档

于 2008-10-30T18:56:23.273 回答
2

这是你要找的吗?

SELECT value, attribute_definition_id, value_rk
FROM attribute_values av1
WHERE value_rk IN (
        SELECT max(value_rk)
        FROM attribute_values av2
        WHERE av2.value = av1.value
)
ORDER BY attribute_definition_id

如果 value_rk 是唯一的,这应该有效。

于 2008-10-30T18:49:32.803 回答
2

好的,这是我的假设:

标准 SQL Server

value_rk 不是数值,但 value 和 attribute_definition_id数值。

SELECT value_rk, MIN(value) as value, MIN(attribute_definition_id) as attribute_definition_id
FROM attribute_values
GROUP BY value_rk
ORDER BY MIN(attribute_definition_id)

如果其中一个字段不是数字,则需要更多考虑 - 请告诉我们。

于 2008-10-30T19:12:05.490 回答
2

如果您愿意使用表变量,则可以将其全部保存在一个数据库调用中,如下所示:

DECLARE @attribute_values TABLE (value int, attribute_definition_id int, value_rk uniqueidentifier)

INSERT INTO @attribute_values (value)
SELECT DISTINCT value FROM attribute_values

UPDATE @attribute_values
SET attribute_definition_id = av2.attribute_definition_id,
    value_rk = av2.value_rk
FROM @attribute_values av1
INNER JOIN attribute_values av2 ON av1.value = av2.value

SELECT value, attribute_definition_id, value_rk FROM @attribute_values

本质上,您正在创建一个有限的记录集,其中的表填充了唯一的“值”值,并让 SQL Server 仅使用主表中的一个匹配项来填补空白。

编辑添加:此语法在 cfquery 中工作得很好。

于 2008-11-05T22:15:37.687 回答
1
SELECT value, attribute_definition_id, value_rk
FROM attribute_values
WHERE value, value_rk IN (
        SELECT value, max(value_rk)
        FROM attribute_values
        GROUP BY value
)
ORDER BY attribute_definition_id

未测试!

于 2008-10-30T18:47:15.757 回答
1

我不确定我是否完全理解您的设置,但这样的工作是否可行:

SELECT value, attribute_definition_id, value_rk
FROM attribute_values
GROUP BY value
ORDER BY attribute_definition_id;

同样,我不确定您要限制哪一列,或者您希望如何限制它。

于 2008-10-30T18:55:29.487 回答
0

没有我想要的那么优雅——它本质上就是你正在做的,只是在纯 SQL 中——但它可以工作并且都可以在 SQL 中完成。

DECLARE @mytable TABLE(mykey NVARCHAR(512), myVal NVARCHAR(512))

声明 @keyVal NVARCHAR(512)
声明 @depVal NVARCHAR(512)
声明 myCursor CURSOR 为
   从属性值中选择 DISTINCT(值)
打开我的光标
从 myCursor 获取下一个到 @keyVal
而@@FETCH_STATUS=0
  开始
     SET @depVal = (SELECT TOP 1 attribute_definition_id FROM attribute_values WHERE VALUE=@keyVal ORDER BY attribute_definition_id)
     插入@mytable(mykey,myVal)值(@keyVal,@depVal)
     从 myCursor 获取下一个到 @keyVal
  结尾
DEALLOCATE myCursor

选择 * 从 @mytable

您可以使用此方法添加 depVal2 和其他人。

于 2008-10-30T20:04:51.030 回答
0

我想

SELECT DISTINCT a.value, a.attribute_definition_id, 
(SELECT TOP 1 value_rk FROM attribute_values WHERE value = a.value) as value_rk
FROM attribute_values as a
ORDER BY attribute_definition_id

工作过

于 2012-01-06T10:52:20.843 回答
0

正如 John Fiala 所指出的,当您想要对列的子集执行“不同”操作时,SQL 服务器中的规范答案是使用 group by 子句。为什么这是正确的规范答案?好吧,您想拉入不属于您的“不同”组的列。您究竟想为这些附属列提取哪些行?使用 group by 子句并为这些附属列定义聚合函数可以使您的查询表现良好,因为您现在知道这些附属列是如何获得的。这篇文章提供了更多细节:

http://weblogs.sqlteam.com/jeffs/archive/2007/10/12/sql-distinct-group-by.aspx

SELECT value_rk, MIN(value) as value, 
MIN(attribute_definition_id) as attribute_definition_id
FROM attribute_values
GROUP BY value_rk

此外,值得注意的是 MIN 和 MAX 适用于文本和其他几种非数值的数据类型。

于 2012-08-31T18:58:28.230 回答