Это означает, что указанная переменная не указана ни на что. Я мог бы сгенерировать это так:
SqlConnection connection = null;
connection.Open();
Это вызовет ошибку, потому что, пока я объявил переменную «connection
», она не указала ни на что. Когда я пытаюсь вызвать член «Open
», для его устранения нет ссылки, и он будет вызывать ошибку.
Чтобы избежать этой ошибки:
object == null
. Инструмент Resharper JetBrains определит каждое место в вашем коде, которое имеет возможность ошибки нулевой ссылки, позволяя вам ввести нулевую проверку. Эта ошибка является источником ошибок номер один, IMHO.
Сделайте SELECT
с предложением GROUP BY
. Скажем, name - это столбец, в котором вы хотите найти дубликаты:
SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1;
Это вернет результат с именем name в первом столбце , и количество раз, сколько раз это значение появляется во втором.
Взяв @ maxyfc ответ , мне нужно было найти все строк, которые были возвращены с повторяющимися значениями, поэтому я мог бы их редактировать в MySQL Workbench :
SELECT * FROM table
WHERE field IN (
SELECT field FROM table GROUP BY field HAVING count(*) > 1
) ORDER BY field
Я не вижу никаких подходов JOIN, которые имеют много применений с точки зрения дубликатов.
Этот подход дает вам фактические удвоенные результаты.
SELECT t1.* FROM table as t1 LEFT JOIN table as t2 ON t1.name=t2.name and t1.id!=t2.id WHERE t2.id IS NOT NULL ORDER BY t1.name
Один очень поздний вклад ... в случае, если он помогает любому waaaaaay вниз по линии ... У меня была задача найти соответствующие пары транзакций (на самом деле обе стороны передачи от учетной записи к учетной записи) в банковском приложении, чтобы определите, какие из них были «from» и «to» для каждой транзакции между транзакциями, поэтому мы закончили с этим:
SELECT
LEAST(primaryid, secondaryid) AS transactionid1,
GREATEST(primaryid, secondaryid) AS transactionid2
FROM (
SELECT table1.transactionid AS primaryid,
table2.transactionid AS secondaryid
FROM financial_transactions table1
INNER JOIN financial_transactions table2
ON table1.accountid = table2.accountid
AND table1.transactionid <> table2.transactionid
AND table1.transactiondate = table2.transactiondate
AND table1.sourceref = table2.destinationref
AND table1.amount = (0 - table2.amount)
) AS DuplicateResultsTable
GROUP BY transactionid1
ORDER BY transactionid1;
. Результатом является то, что DuplicateResultsTable
предоставляет строки, содержащие совпадение (т. е. дублировать), но он также предоставляет идентичный идентификатор транзакции в обратном порядке во второй раз, когда он совпадает с одной и той же парой, поэтому внешний SELECT
должен группироваться по первому идентификатору транзакции, который выполняется с помощью LEAST
и GREATEST
, чтобы убедиться, что два транзакционных файла всегда находятся в одном порядке в результатах, что делает его безопасным для GROUP
первым, что устраняет все повторяющиеся совпадения. Прошел почти миллион записей и определил 12 000+ матчей всего за 2 секунды. Конечно, transactionid - это основной индекс, который действительно помог.
SELECT ColumnA, COUNT( * )
FROM Table
GROUP BY ColumnA
HAVING COUNT( * ) > 1
Ниже вы найдете все product_id, которые используются более одного раза. Вы получаете только одну запись для каждого product_id.
SELECT product_id FROM oc_product_reward GROUP BY product_id HAVING count( product_id ) >1
Код, взятый из: http://chandreshrana.blogspot.in/2014/12/find-duplicate-records-based-on -any.html
Я видел вышеприведенный результат, и запрос будет работать нормально, если вам нужно проверить одно значение столбца, которое является дубликатом. Например, электронная почта.
Но если вам нужно проверить с большим количеством столбцов и хотите проверить комбинацию результата, чтобы этот запрос работал нормально:
SELECT COUNT(CONCAT(name,email)) AS tot,
name,
email
FROM users
GROUP BY CONCAT(name,email)
HAVING tot>1 (This query will SHOW the USER list which ARE greater THAN 1
AND also COUNT)
SELECT *
FROM `dps`
WHERE pid IN (SELECT pid FROM `dps` GROUP BY pid HAVING COUNT(pid)>1)
SELECT DISTINCT a.email FROM `users` a LEFT JOIN `users` b ON a.email = b.email WHERE a.id != b.id;
a.email
на a.*
и получить все идентификаторы строк с дубликатами.
– NobleUplift
24 July 2014 в 15:53
SELECT DISTINCT a.*
разрешилось почти мгновенно.
– NobleUplift
26 October 2017 в 19:54
Для удаления повторяющихся строк с несколькими полями сначала привяжите их к новому уникальному ключу, который указан только для отдельных строк, а затем используйте команду «group by» для удаления повторяющихся строк с помощью того же нового уникального ключа:
Create TEMPORARY table tmp select concat(f1,f2) as cfs,t1.* from mytable as t1;
Create index x_tmp_cfs on tmp(cfs);
Create table unduptable select f1,f2,... from tmp group by cfs;
CREATE TEMPORARY TABLE ...
? Небольшое объяснение вашего решения было бы замечательным.
– maxhb
4 February 2016 в 11:24
Мой последний запрос включил несколько ответов здесь, которые помогли - объединить группу по, count & amp; GROUP_CONCAT.
SELECT GROUP_CONCAT(id), `magento_simple`, COUNT(*) c
FROM product_variant
GROUP BY `magento_simple` HAVING c > 1;
Это обеспечивает идентификатор обоих примеров (разделенных запятыми), нужного мне штрих-кода и количества дубликатов.
Соответственно изменить таблицу и столбцы.
CREATE TABLE tbl_master
(`id` int, `email` varchar(15));
INSERT INTO tbl_master
(`id`, `email`) VALUES
(1, 'test1@gmail.com'),
(2, 'test2@gmail.com'),
(3, 'test1@gmail.com'),
(4, 'test2@gmail.com'),
(5, 'test5@gmail.com');
QUERY : SELECT id, email FROM tbl_master
WHERE email IN (SELECT email FROM tbl_master GROUP BY email HAVING COUNT(id) > 1)
Я предпочитаю использовать оконные функции (MySQL 8.0+), чтобы найти дубликаты, потому что я мог видеть целую строку:
WITH cte AS (
SELECT *
,COUNT(*) OVER(PARTITION BY col_name) AS num_of_duplicates_group
,ROW_NUMBER() OVER(PARTITION BY col_name ORDER BY col_name2) AS pos_in_group
FROM table
)
SELECT *
FROM cte
WHERE num_of_duplicates_group > 1;
Исходя из ответа левика, чтобы получить идентификаторы дубликатов строк, вы можете сделать GROUP_CONCAT
, если ваш сервер поддерживает его (это вернет список идентификаторов, разделенных запятыми).
SELECT GROUP_CONCAT(id), name, COUNT(*) c FROM documents GROUP BY name HAVING c > 1;
SELECT id, GROUP_CONCAT(id), name, COUNT(*) c [...]
, он включит встроенное редактирование, и он должен обновить все вовлеченные строки (или, по крайней мере, первый из них соответствует), но, к сожалению, редактирование генерирует Ошибка Javascript ...
– Armfoot
14 September 2015 в 11:25
SELECT varchar_col
FROM table
GROUP BY varchar_col
HAVING count(*) > 1;
IN()
/ NOT IN()
.
– wmassingham
24 November 2015 в 21:42
SELECT
t.*,
(SELECT COUNT(*) FROM city AS tt WHERE tt.name=t.name) AS count
FROM `city` AS t
WHERE
(SELECT count(*) FROM city AS tt WHERE tt.name=t.name) > 1 ORDER BY count DESC
SELECT DISTINCT name, count(name) as times FROM yourtable GROUP BY name
HAVING times > 1
Далее, этот ответ не имеет объяснения.
– Chris K
24 January 2018 в 16:56
SELECT *
FROM mytable mto
WHERE EXISTS
(
SELECT 1
FROM mytable mti
WHERE mti.varchar_column = mto.varchar_column
LIMIT 1, 1
)
Этот запрос возвращает полные записи, а не только отдельные varchar_column
.
Этот запрос не использует COUNT(*)
. Если имеется много дубликатов, COUNT(*)
стоит дорого, и вам не нужно целое COUNT(*)
, вам просто нужно знать, есть ли две строки с одинаковым значением.
Имея индекс на varchar_column
, конечно, значительно ускорит этот запрос.
This query returns complete records, not just distinct varchar_column's.
---- СОВЕРШЕННО. Thankuuu ..! 1 вверх.
– Parag Tyagi -morpheus-
20 August 2014 в 17:52
GROUP BY
и HAVING
возвращает только один из возможных дубликатов. Кроме того, производительность с индексированным полем вместо COUNT(*)
и возможность ORDER BY
группировать дубликаты записей.
– Rémi Breton
22 September 2015 в 20:08
Предполагая, что ваша таблица имеет имя TableABC, а нужный столбец - это Col, а первичный ключ - T1 - Key.
SELECT a.Key, b.Key, a.Col
FROM TableABC a, TableABC b
WHERE a.Col = b.Col
AND a.Key <> b.Key
Преимущество этого подхода в этом ответе - это ключ .
Select column_name, column_name1,column_name2, count(1) as temp from table_name group by column_name having temp > 1
GROUP_CONCAT(id)
, и он отобразит идентификаторы. См. Мой ответ для примера. – Matt Rardon 19 February 2015 в 01:53ERROR: column "c" does not exist LINE 1
? – User 4 October 2015 в 17:36