2014-01-27 3 views
2

Я знаю, почему из-за этой ошибки, но я не знаю, как ее исправить. вот такая ситуация: У меня есть стол А, который имеет следующие столбцы userID, switch, plateType, groupVal, brokeage. userID, plateType и groupVal представляют собой уникальный ключ. groupVal и userId могут принимать разные значения, но plateType просто может иметь 4 (A, B, C, D). Пример записи для одного userId и один groupVal будет:Нарушение кардинальности: 1242 Подзапрос возвращает более 1 строки

Userid-------plateType------ groupVal------- brokeage 
UserA--------- A----- ------------  3---------------  5.5 
UserA--------- B----- ------------  3---------------  7.6 
UserA--------- C----- ------------  3---------------  2.1 
UserA--------- D----- ------------  3---------------  3.5 

Так что, когда я запускаю следующий запрос, если это записи не существует, то будет создан, но если они существуют, они должны быть обновлены , но эта ошибка, что я получаю: нарушение

Cardinality: 1242 подзапрос возвращает более чем на 1 строку

Insert into tableA (userID, plateType, groupVal, brokeage) 
Select 'UserB', plateType, groupVal, brokeage from tableA 
where userID = 'UserA' 
on duplicate key 
Update brokeage = (Select brokeage from tableA where userID = 'UserA') 

Я знаю, что это в подзапросе, выбранном, который я использую в обновлении ... так что мне действительно нужно выбрать из tableA записей, где userId = UserA, но которые соответствуют groupVal и plateTypes, которые должны быть обновлены UserB. Надеюсь, я дам себе понять, и кто-то может дать ответ.

ответ

1

Вы должны ссылаться на значения в своем заявлении SELECT, что означает, что вам вообще не нужен подзапрос. Когда мы ссылаемся на таблицу, используемую в SELECT, вы можете использовать значение в UPDATE:

INSERT INTO tableA (userID, plateType, groupVal, brokeage) 
SELECT 'UserB', plateType, groupVal, brokeage 
    FROM tableA AS t 
    WHERE userID = 'UserA' 
ON DUPLICATE KEY 
-- Set value of `brokeage` for UserB to the one set for UserA, from the SELECT 
UPDATE brokeage = t.brokeage 
+0

Проблема с этим подходом заключается в том, что он обновляется, но все с одинаковым значением. Пример, если userA имеет 3.5 нарушения в таблоType D, все строки UserB в brpokeage будут принимать это значение. – emc

+0

перечитывая свой вопрос, вам вообще не нужен подзапрос, см. Мое редактирование. – doublesharp

Смежные вопросы