Arhn - архитектура программирования

Обновление нескольких записей на основе результатов выбора

Вот мой базовый SQL-запрос в SQL Server 2008:

SELECT userID
FROM coreUsers 
INNER JOIN pluginSales ON coreUser.userID = pluginSales.userID
WHERE (coreUser.CurrentYear = '2014') 
  AND (pluginSales.PaidShipping = 'Yes') 
   OR (coreUser.IsContract = 'Yes')

Проверено еще раз 19 декабря 2014 г., результат 61.

Мне нужно иметь возможность обновить столбец таблицы pluginSales ShipppingDate для всех записей, полученных в результате приведенного выше оператора.

coreUser.userID — мой уникальный ключ, который автоматически увеличивается.

pluginSales имеет столбец ShippingDate, который является просто стандартным varchar, который мне нужно обновить до '12/16/2014', если запись была установлена ​​​​на 2014 (coreUser.CurrentYear) и они оплачивают доставку (pluginSales.PaidShipping) ИЛИ если они являются контрактными клиентами (coreUser.IsContract)

РЕДАКТИРОВАТЬ №1

Я попробовал следующее...

UPDATE       pluginSales
SET                ShippingDate = ''
FROM            coreUsers AS cu INNER JOIN
                         pluginSales AS pis ON cu.userID = pis.userID CROSS JOIN
                         pluginSales
WHERE (cu.CurrentYear = '2014') AND (pis.PaidShipping = 'Yes' OR pis.IsContract = 'Yes')

Проверено еще раз 19 декабря 2014 года с измененными 554 записями (вся моя база данных pluginSales)

Это затронуло ВСЕ мои строки, а не только определенные. Пожалуйста, порекомендуйте.


  • Плохие привычки: выбор неправильного типа данных – всегда следует использовать наиболее подходящий тип данных. ПОЧЕМУ вы сохраняете ДАТУ (ShippingDate) как varchar — вместо этого используйте DATE или DATETIME2(n)! Вот для чего существуют эти типы! 17.12.2014
  • Причина, по которой это так, заключается в том, что у меня нет проверки на стороне клиента для определенной даты. Я знаю, что это плохая идея, но для текущей системы я использую то, что мне нужно, и работает так, как предполагалось. 19.12.2014
  • Я отредактировал ваш заголовок. См. Должны ли вопросы включать «теги» в свои заголовки?, если нет единого мнения, не следует. 20.12.2014

Ответы:


1

Сначала запустите выбор

SELECT *
FROM pluginSales PS
INNER JOIN coreUsers CU ON CU.userID = PS.userID
WHERE (CU.CurrentYear = '2014')
    AND (PS.PaidShipping = 'Yes')
    OR (CU.IsContract = 'Yes')

затем измените только первую строку на UPDATE...

UPDATE pluginSales SET ShippingDate = '12/16/2014'
FROM pluginSales PS
INNER JOIN coreUsers CU ON CU.userID = PS.userID
WHERE (CU.CurrentYear = '2014')
    AND (PS.PaidShipping = 'Yes')
    OR (CU.IsContract = 'Yes')

В вашем предложении Where есть OR. Вы можете захотеть явно сгруппировать с помощью круглых скобок ().

17.12.2014
  • Это не работает, на самом деле это 552 строки, когда исходный оператор SELECT возвращает только 61 элемент. Это явно не работает 20.12.2014
  • @eqiz, я добавил выбор, который синтаксически идентичен тому, который у вас есть, но немного изменен, чтобы обеспечить сопоставимость при обновлении. Если ваше предложение where правильное, то выбор и обновление должны привести к одинаковому количеству строк. 20.12.2014
  • Ваше исправление сработало отлично, спасибо за это изменение/обновление! 28.12.2014

  • 2

    Вы можете сделать это с помощью update и join:

    UPDATE cu
        SET ShippingDate '12/16/2014'
    FROM coreUsers cu INNER JOIN
         pluginSales pis
         ON cu.userID = pis.userID
    WHERE (cu.CurrentYear = '2014' AND (pis.PaidShipping = 'Yes') OR (pis.IsContract = 'Yes');
    

    Вам действительно может понадобиться это предложение where:

    WHERE (cu.CurrentYear = '2014') AND (pis.PaidShipping = 'Yes' OR pis.IsContract = 'Yes');
    

    Обратите внимание, что вы не должны хранить даты в строках. Вместо этого вы должны использовать собственные типы date или datetime. Если вам нужно хранить даты в виде строк, вы должны использовать формат ГГГГ-ММ-ДД, чтобы такие операции, как order by и сравнения, работали со значениями.

    17.12.2014
  • Это ТОЧНО то же самое, что и amit_g .. это не работает, это, черт возьми, повлияло на всю мою базу данных, а НЕ только на записи, которые предполагалось. Первоначальный оператор выбора, который я привел выше, влияет только на 61 возврат, в то время как ваш только что затронул всю мою базу данных. 20.12.2014
  • @экиз . . . Я бы проверил альтернативный пункт where. 20.12.2014
  • @экиз . . . Тогда версия с исходным предложением where будет иметь правильную логику. 20.12.2014
  • MS SQL Server 2008 не понравилось ваше утверждение, поэтому он переформулировал его в то, что я указал выше в моем Редактировании № 1. Это должно быть само утверждение, которое вызывает проблему. я ничего не менял, просто скопировал и вставил 20.12.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..