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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Обновленный для использования недавно обеспеченных данных:
решения с помощью исходных данных могут быть найдены в конце этого ответа.
Используя Ваши новые данные:
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
Для MySQL:
SELECT contract, activity
FROM table
GROUP BY contract
HAVING COUNT(DISTINCT activity) = 1
Я - поклонник НЕ, СУЩЕСТВУЕТ
SELECT DISTINCT contract, activity FROM table t1
WHERE NOT EXISTS (
SELECT * FROM table t2
WHERE t2.contract = t1.contract AND t2.activity != t1.activity
)
Попробуйте это:
select
contract,
max (activity)
from
mytable
group by
contract
having
count (activity) = 1
Измененный!
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
Использование "динамической таблицы" возможность в 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
Принятие Вашей таблицы данных называют 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 - должен работать в другом месте также.
Вот другая опция с помощью отличного количества 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
Извините Вы не используете PostgreSQL...
ВЫБИРАЮТ ОТЛИЧНЫЙ ПО контракту, действие * ИЗ thetable контракта ORDER BY, действие
, http://www.postgresql.org/docs/8.3/static/sql-select.html#SQL-DISTINCT
, О, ожидает. Вы только хотите значения точно с один...
ИЗБРАННЫЙ контракт, действие, количество () ИЗ thetable контракта GROUP BY, действие, ИМЕЮЩЕЕ количество () = 1
SELECT DISTINCT Contract, Activity
FROM Contract WHERE Contract IN (
SELECT Contract
FROM Contract
GROUP BY Contract
HAVING COUNT( DISTINCT Activity ) = 1 )
Извините, старый пост, который я знаю, но у меня была та же проблема, я не мог заставить работать что-либо из вышеперечисленного, но я понял это.
Это сработало для меня:
ВЫБРАТЬ DISTINCT [столбец] как уникальные значения ИЗ [db]. [Dbo]. [Table]