Недавно я начал переучивать синтаксис SQL примерно через 15 лет бездействия. Я знаком со старым синтаксисом ANSI-89 JOIN, и новый синтаксис немного привыкает.Обновление SQL на основе количества строк
В любом случае, что я пытаюсь сделать, это подсчитать количество элементов в двух запросах, а если они равны, установите флаг для строки.
Вот моя структура таблицы:
PERSON
ID -- unique ID for the person
HOUSE
ID -- unique ID for the house
PersonID -- person who owns the house
BATHROOM
HouseID -- House that the room is in
Type -- The type of bathroom - ensuite, powder, etc.
Pieces -- The number of pieces in the bathroom.
OK. Поэтому я хотел бы добавить новое поле в таблице PERSON
, в котором отслеживается, будут ли все ванные комнаты во всех их домах состоять из 3 штук. (Не спрашивайте, почему - это, очевидно, производственный сценарий, но он хорошо отображает сценарий реального мира, который я пытаюсь решить).
Итак, я начинаю со следующим:
ALTER TABLE person ADD All_Three tinyint(1) NOT NULL DEFAULT 1 AFTER ID;
Теперь у меня есть поле, и это обязательство к 1
.
Итак, мне нужно запустить запрос, который будет заполнять его. Вот моя попытка:
UPDATE IGNORE person,
(SELECT COUNT(*) AS count
FROM house, bathroom
WHERE house.PersonID=person.ID
AND bathroom.HouseID=house.ID
AND bathroom.Type='ensuite'
AND bathroom.Pieces=3) num_three,
(SELECT COUNT(*) AS count
FROM house, bathroom
WHERE house.PersonID=person.ID
AND bathroom.HouseID=house.ID) all_bathrooms
SET person.All_Three=2
WHERE num_three.count=all_bathrooms.count;
Это кажется мне вполне логичным; Первый подзапрос подсчитывает количество ванных комнат с тремя частями, а второй подсчитывает общее количество ванных комнат. Если они равны, (т. Е. Все ванные, принадлежащие этому человеку, состоят из 3 штук), тогда мы можем установить поле All_Three
.
Это завершается с ошибкой
ERROR 1054 (42S22): Unknown column 'person.ID' in 'where clause'
Итак, как же я ссылаться на person
внутри подзапроса? Я попробовал наложить его на псевдонимы, но это тоже не с той же ошибкой.
EDIT: Оказалось, что цель была неправильной. Что мне нужно сделать, это установить поле all_three
, если каждый дом, принадлежащий человеку, содержит только 3 штуки, , и каждый дом имеет по крайней мере один санузел (который, очевидно, должен быть 3 штуки).
Мне нравится объяснение - спасибо! – Trenin