Можно ли эффективно сформулировать условие для дублированных элементов в столбце в SQL? - PullRequest
0 голосов
/ 09 апреля 2019

Я работаю с запросом, в котором я объединяю две таблицы и затем стремлюсь остаться только со строками, представляющими особый интерес.Одним из таких условий является то, что выбираются только строки, которые имеют повторяющиеся значения в определенных столбцах.

Данные и значения являются произвольными для этого случая.Team1 и Team2 содержат значения названий команд, такие как «Team Red», «Team Blue», ... и т. Д.

SELECT date, team1, team2, value

FROM database.team_table

INNER JOIN database.teaminfo_table ON database.team_table

WHERE 

       date >= sysdate  --example condition

AND

       --condition to only take in the specified rows

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

Ожидаемый результат состоит в том, что если, скажем, для столбца Команда A, если есть две записи, называемые «Команда»Красное », и больше нет таких дубликатов в столбце.Окончательный результат должен состоять из двух строк, каждая из которых имеет значение Team A, равное Team Red.

1 Ответ

2 голосов
/ 09 апреля 2019

Предложения WHERE оцениваются для каждой отдельной строки.

Если критерием для сохранения строки в наборе результатов является наличие другой строки в той же таблице, которая удовлетворяет некоторым характеристикам, то предложение WHERE для использованияis

WHERE EXISTS ...

Таким образом, вы получите

SELECT ... FROM TEAM_TABLE AS OUTER WHERE EXISTS ( SELECT 1 FROM TEAM_TABLE INNER WHERE INNER.whatever < / = / > OUTER.whatever )

Не забудьте также включить необходимое условие WHERE во внутреннем SELECT, чтобы сделатьубедитесь, что только строки, которые отличаются от строки OUTER, будут удовлетворять условию.

например

AND OUTER.<primary key here> <> INNER.<primary key here>

или

AND OUTER.ROWID() <> INNER.ROWID()

, если вы работаете в СУБД, которая имеет эти функции ROWID () (и, как правило, будет работать немного лучше, если вы ее используете).

...