Выберите один столбец DISTINCT SQL

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

14
задан James A Mohler 25 September 2013 в 20:10
поделиться

9 ответов

это могло бы работать:

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

.. не протестированный.

11
ответ дан 1 December 2019 в 07:41
поделиться
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;

, Другими словами, найдите строку a1, для которого никакая строка a2 не существует с тем же value и большее value_rk.

8
ответ дан 1 December 2019 в 07:41
поделиться

Это должно работать на PostgreSQL, я не знаю, какую DBMS Вы используете.

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

Документы PostgreSQL

8
ответ дан 1 December 2019 в 07:41
поделиться

Это то, что Вы ищете?

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 уникален, это должно работать.

2
ответ дан 1 December 2019 в 07:41
поделиться

Если Вы открыты для использования табличных переменных, Вы могли бы сохранить все это в вызове единой базы данных как это:

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

По существу Вы создаете ограниченный recordset с таблицей, заполненной уникальными значениями 'значения', и позволяете SQL Server заполнить разрывы, использующие только одно из соответствий от основной таблицы.

Отредактированный для добавления: Этот синтаксис работает в cfquery очень хорошо.

2
ответ дан 1 December 2019 в 07:41
поделиться

Я не уверен, понимаю ли я полностью Вашу установку, но был бы что-то вроде этого работать:

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

Снова, я не настоящий уверенный, какой столбец это, Вы пытаетесь ограничить, или как Вы желаете ограничить его.

1
ответ дан 1 December 2019 в 07:41
поделиться
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

НЕ ПРОТЕСТИРОВАННЫЙ!

1
ответ дан 1 December 2019 в 07:41
поделиться

Хорошо, вот мои предположения:

Стандартный SQL Server

value_rk не является числовым значением, но значение и 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)

, Если одно из тех полей не будет числовым, то оно потребует, более мысль - сообщила нам.

2
ответ дан 1 December 2019 в 07:41
поделиться

Менее изящный, чем я хотел бы----, это по существу, что Вы делаете, только в чистом 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 и других, использующих этот метод.

0
ответ дан 1 December 2019 в 07:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: