Я хочу, чтобы SET
логического значения Правда, в одном столбце, но только если значение в соседнем столбце уникально (независимо от того, что это значения).
Предположим, ROOM_IS_PRIVATE
- это логический столбец, который я устанавливаю, и ROOM_VALUE
- это столбец, значение которого я хочу проверить на уникальность. Я новичок в написании запросов, поэтому вот что у меня есть до сих пор:
SET ROOM_IS_PRIVATE = '1'
WHERE COUNT(ROOM_VALUE) = 1;
Но это не работает для меня. Я даже на правильном пути, используя функцию count?
EDIT: Вот пример результатов, которые я надеюсь достичь:
| ROOM_VALUE | ROOM_IS_PRIVATE |
|--------------|-------------------|
| 54 | 0 |
| 13 | 1 |
| 08 | 0 |
| 08 | 0 |
| 54 | 0 |
| 19 | 1 |
| 08 | 0 |
Второй столбец становится только 1
если значение в первом столбце уникально для этого столбца.
Предложение SET
выглядит правильно. Но это не действительное утверждение; похоже, что нам не хватает ключевого слова UPDATE
, имя таблицы, которую мы обновляем.
Если мы хотим изменить ТОЛЬКО строки, где room_value
является уникальным, мы могли бы сделать что-то вроде этого:
UPDATE mytable t
JOIN ( SELECT r.room_value
, COUNT(*) AS cnt
FROM mytable r
GROUP BY r.room_value
) s
ON s.room_value = t.room_value
SET t.room_is_private = CASE WHEN s.cnt = 1 THEN 1 ELSE t.room_is_private END
Выполняется встроенное представление s
и результаты материализуются как производная таблица. Это дает нам различные значения room_value
, а также количество строк с одинаковым значением room_value
.
Затем мы присоединяем полученную историю к исходной таблице, сопоставляя столбец room_value
, так что теперь для каждой строки в нашей таблице мы можем знать количество строк, имеющих одинаковое значение room_value
.
В предложении SET
мы используем выражение, которое проверяет счет, и условно назначает 1
(когда cnt=1
) и в противном случае значение room_is_private
изменяется.
Я подозреваю, что мы, вероятно, также хотим установить room_is_private
= 0, когда room_value не является уникальным, поэтому вместо того, чтобы устанавливать room_is_private
в текущее значение (то есть оставляя его неизменным), вместо этого мы назначили 0
.
UPDATE mytable t
JOIN ( SELECT r.room_value
, COUNT(*) AS cnt
FROM mytable r
GROUP BY r.room_value
) s
ON s.room_value = t.room_value
SET t.room_is_private = CASE WHEN s.cnt = 1 THEN 1 ELSE 0 END
Пожалуйста, попробуйте как this-
SELECT
ROOM_IS_PRIVATE = CASE WHEN COUNT(ROOM_VALUE) = 1 THEN 1 ELSE 0 END
FROM yourtableName
room_value
(по сути, один счетчик всех строк в таблице), затем сравнивать с литералом 1, а затем возвращать 1 или 0, затем сравнивать 0 или 1 с неопределенным значением room_is_private
, оценивающим, что в логическом контексте он возвращает 0, 1 или NULL. Этот запрос, вероятно, будет выполнен, но я не вижу, как это решает вопрос, заданный OP. Этот ответ, должно быть, был поддержан несгибаемым поклонником для ответов "попробуй это".
Попробуйте условное обновление следующим образом:
update a set
a.ROOM_IS_PRIVATE= case when cnt is null then 1 else
a.ROOM_IS_PRIVATE end
from yourtable a
left join(
select roomvalue, count(*) cnt
from yourtable
group by roomvalue
having count(*)>1 )b
on a.roomvalue=b.roomvalue