Выберите один столбец DISTINCT SQL - PullRequest
14 голосов
/ 30 октября 2008

Добавлено: Работа с 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 по-прежнему приветствуются:)

Ответы [ 11 ]

0 голосов
/ 30 октября 2008

Менее элегантно, чем хотелось бы - по сути, это то, что вы делаете, просто на чистом SQL - но это работает и все это можно сделать на SQL.

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

DECLARE @keyVal NVARCHAR(512)
DECLARE @depVal NVARCHAR(512)
DECLARE myCursor CURSOR for
   SELECT DISTINCT(value) FROM attribute_values
OPEN myCursor
FETCH NEXT FROM myCursor INTO @keyVal
WHILE @@FETCH_STATUS=0
  BEGIN
     SET @depVal = (SELECT TOP 1 attribute_definition_id FROM attribute_values WHERE VALUE=@keyVal ORDER BY attribute_definition_id)
     INSERT INTO @mytable (mykey, myVal) VALUES (@keyVal, @depVal)
     FETCH NEXT FROM myCursor INTO @keyVal
  END
DEALLOCATE myCursor

SELECT * FROM @mytable

Вы можете добавить depVal2 и другие, используя этот метод.

...