SQL: Как я ВЫБИРАЮ только строки с уникальным значением на определенном столбце?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

16
задан Taryn 16 July 2013 в 20:32
поделиться

11 ответов

Обновленный для использования недавно обеспеченных данных:

решения с помощью исходных данных могут быть найдены в конце этого ответа.

Используя Ваши новые данные:

DECLARE  @T TABLE( [contract] INT, project INT, activity INT )
INSERT INTO @T VALUES( 1000,    8000,    10 )
INSERT INTO @T VALUES( 1000,    8000,    20 )
INSERT INTO @T VALUES( 1000,    8001,    10 )
INSERT INTO @T VALUES( 2000,    9000,    49 )
INSERT INTO @T VALUES( 2000,    9001,    49 )
INSERT INTO @T VALUES( 3000,    9000,    79 )
INSERT INTO @T VALUES( 3000,    9000,    78 )

SELECT DISTINCT [contract], activity FROM @T AS A WHERE
    (SELECT COUNT( DISTINCT activity ) 
     FROM @T AS B WHERE B.[contract] = A.[contract]) = 1

возвраты: 2000, 49

Решения с помощью исходных данных

ПРЕДУПРЕЖДЕНИЕ: следующие решения используют данные, ранее данные в вопросе, и не могут иметь смысла для текущего вопроса. Я оставил их присоединенными для полноты только.

SELECT Col1, Count( col1 ) AS count FROM table 
GROUP BY col1
HAVING count > 1

Это должно получить Вас список всех значений в col1, которые не отличны. Можно поместить это в var таблицы или временную таблицу и соединение против нее.

Вот пример с помощью подзапроса:

DECLARE @t TABLE( col1 VARCHAR(1), col2 VARCHAR(1), col3 VARCHAR(1) )

INSERT INTO @t VALUES( 'A', 'B', 'C' );
INSERT INTO @t VALUES( 'D', 'E', 'F' );
INSERT INTO @t VALUES( 'A', 'J', 'K' );
INSERT INTO @t VALUES( 'G', 'H', 'H' );

SELECT * FROM @t

SELECT col1, col2 FROM @t WHERE col1 NOT IN 
    (SELECT col1 FROM @t AS t GROUP BY col1 HAVING COUNT( col1 ) > 1)

Это возвращается:

D   E
G   H

И другой метод, что пользователи временная таблица и соединение:

DECLARE @t TABLE( col1 VARCHAR(1), col2 VARCHAR(1), col3 VARCHAR(1) )

INSERT INTO @t VALUES( 'A', 'B', 'C' );
INSERT INTO @t VALUES( 'D', 'E', 'F' );
INSERT INTO @t VALUES( 'A', 'J', 'K' );
INSERT INTO @t VALUES( 'G', 'H', 'H' );

SELECT * FROM @t

DROP TABLE #temp_table  
SELECT col1 INTO #temp_table
    FROM @t AS t GROUP BY col1 HAVING COUNT( col1 ) = 1

SELECT t.col1, t.col2 FROM @t AS t
    INNER JOIN #temp_table AS tt ON t.col1 = tt.col1

Также возвраты:

D   E
G   H
13
ответ дан 30 November 2019 в 17:17
поделиться

Для MySQL:

SELECT contract, activity
FROM table
GROUP BY contract
HAVING COUNT(DISTINCT activity) = 1
7
ответ дан 30 November 2019 в 17:17
поделиться

Я - поклонник НЕ, СУЩЕСТВУЕТ

SELECT DISTINCT contract, activity FROM table t1
WHERE NOT EXISTS (
  SELECT * FROM table t2
  WHERE t2.contract = t1.contract AND t2.activity != t1.activity
)
3
ответ дан 30 November 2019 в 17:17
поделиться

Попробуйте это:

select 
         contract,
        max (activity) 
from
         mytable 
group by
         contract 
having
         count (activity) = 1
2
ответ дан 30 November 2019 в 17:17
поделиться

Измененный!

SELECT distinct contract, activity from @t a
WHERE (SELECT COUNT(DISTINCT activity) FROM @t b WHERE b.contract = a.contract) = 1

И вот другой - более короток/более чист без подзапроса

select contract, max(activity) from @t
group by contract
having count(distinct activity) = 1
2
ответ дан 30 November 2019 в 17:17
поделиться

Использование "динамической таблицы" возможность в SQL Server (запросы против окруженного круглой скобкой запроса), можно возвратить 2000, 49 w/следующее. Если Ваша платформа не предлагает эквивалент "динамической таблице" расширение ANSI, можно всегда использовать временную таблицу в two-steps/statement путем вставки результатов в "динамической таблице" к временной таблице и затем выполнения последующего выбора на временной таблице.

DECLARE  @T TABLE(
    [contract] INT,
    project INT,
    activity INT
)

INSERT INTO @T VALUES( 1000,    8000,    10 )
INSERT INTO @T VALUES( 1000,    8000,    20 )
INSERT INTO @T VALUES( 1000,    8001,    10 )
INSERT INTO @T VALUES( 2000,    9000,    49 )
INSERT INTO @T VALUES( 2000,    9001,    49 )
INSERT INTO @T VALUES( 3000,    9000,    79 )
INSERT INTO @T VALUES( 3000,    9000,    78 )

SELECT
    [contract],
    [Activity] =  max (activity)
FROM
    (
    SELECT
        [contract],
        [Activity]
    FROM
        @T
    GROUP BY
        [contract],
        [Activity]
    ) t
GROUP BY
    [contract]
HAVING count (*) = 1
2
ответ дан 30 November 2019 в 17:17
поделиться

Принятие Вашей таблицы данных называют ProjectInfo:

SELECT DISTINCT Contract, Activity
    FROM ProjectInfo
    WHERE Contract = (SELECT Contract
                          FROM (SELECT DISTINCT Contract, Activity
                                    FROM ProjectInfo) AS ContractActivities
                          GROUP BY Contract
                          HAVING COUNT(*) = 1);

самый внутренний запрос определяет контракты и операции. Следующий уровень запроса (средний) определяет контракты, где существует всего одно действие. Наиболее удаленный запрос затем вытягивает контракт и действие от таблицы ProjectInfo для контрактов, которые имеют единственное действие.

Протестированное использование IBM Informix Динамический Сервер 11.50 - должен работать в другом месте также.

1
ответ дан 30 November 2019 в 17:17
поделиться

Вот другая опция с помощью отличного количества SQL-серверов:

DECLARE  @T TABLE( [contract] INT, project INT, activity INT )
INSERT INTO @T VALUES( 1000,    8000,    10 )
INSERT INTO @T VALUES( 1000,    8000,    20 )
INSERT INTO @T VALUES( 1000,    8001,    10 )
INSERT INTO @T VALUES( 2000,    9000,    49 )
INSERT INTO @T VALUES( 2000,    9001,    49 )
INSERT INTO @T VALUES( 3000,    9000,    79 )
INSERT INTO @T VALUES( 3000,    9000,    78 )



SELECT DISTINCT [contract], activity FROM @T AS A WHERE
    (SELECT COUNT( DISTINCT activity ) 
     FROM @T AS B WHERE B.[contract] = A.[contract]) = 1
1
ответ дан 30 November 2019 в 17:17
поделиться

Извините Вы не используете PostgreSQL...

ВЫБИРАЮТ ОТЛИЧНЫЙ ПО контракту, действие * ИЗ thetable контракта ORDER BY, действие

, http://www.postgresql.org/docs/8.3/static/sql-select.html#SQL-DISTINCT

, О, ожидает. Вы только хотите значения точно с один...

ИЗБРАННЫЙ контракт, действие, количество () ИЗ thetable контракта GROUP BY, действие, ИМЕЮЩЕЕ количество () = 1

1
ответ дан 30 November 2019 в 17:17
поделиться
SELECT DISTINCT Contract, Activity
FROM Contract WHERE Contract IN (
SELECT Contract 
FROM Contract
GROUP BY Contract
HAVING COUNT( DISTINCT Activity ) = 1 )
1
ответ дан 30 November 2019 в 17:17
поделиться

Извините, старый пост, который я знаю, но у меня была та же проблема, я не мог заставить работать что-либо из вышеперечисленного, но я понял это.

Это сработало для меня:

ВЫБРАТЬ DISTINCT [столбец] как уникальные значения ИЗ [db]. [Dbo]. [Table]

0
ответ дан 30 November 2019 в 17:17
поделиться
Другие вопросы по тегам:

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