Структура данных, подобная куче, используется алгоритмом нахождения доступного распределения памяти. Ниже изложено http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html .
Когда вызывается
new
, он начинает искать свободный блок памяти, который соответствует размеру вашего запроса. Предположим, что такой блок памяти найден, он помечен как зарезервированный и возвращается указатель на это местоположение. Существует несколько алгоритмов для достижения этого, потому что необходимо выполнить компромисс между сканированием всей памяти для поиска наименьшего свободного блока, большего, чем размер вашего объекта, или возврата первого, где требуется память. Чтобы повысить скорость получения блока памяти, свободные и зарезервированные области памяти сохраняются в структуре данных, подобной бинарным деревьям, называемым кучей.
Используйте коррелированный подзапрос
select * from tablename a
where not exists (select 1 from tablename b where a.name=b.name having count(*)>1)
ВЫХОД:
id name
2 Chad
4 Tim
Вы можете использовать NOT EXISTS
:
SELECT t.*
FROM table t
WHERE NOT EXISTS (SELECT 1 FROM table t1 WHERE t1.name = t.Name AND t1.id <> t.id);
. Для получения более быстрого набора результатов потребуется индекс table(id, name)
.
Пожалуйста, попробуйте это.
SELECT
DISTINCT id,NAME
FROM
tableName
Как насчет простой агрегации?
select any_value(id), name
from t
group by name
having count(*) = 1;
BigQuery довольно хорошо работает с агрегациями, так что это может быть довольно эффективным.
Вы можете использовать несколько подзапросов, чтобы извлечь то, что вам нужно.
SELECT * FROM tableName
WHERE name IN (SELECT name FROM (SELECT name, COUNT(name) FROM tableName
GROUP BY name
HAVING COUNT(name) = 1) AS subQuery)
Использование существует и проверьте имя пользователя
select id,name
from table t1
where exists ( select 1 from table t2 where t1.name=t2.name
having count(*)=1
)
Ниже для стандартного SQL BigQuery и работает для любого количества столбцов без явного вызова их и не требует каких-либо присоединения или подвыборов
#standardSQL
SELECT t.*
FROM (
SELECT ANY_VALUE(t) t
FROM `project.dataset.table` t
GROUP BY name
HAVING COUNT(1) = 1
)