Правильный синтаксис для запроса INSERT INTO SELECT - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь вставить записи, которые удалены из одной таблицы, в другую, чтобы я мог заархивировать удаленные записи, например, как Windows Корзина. Для этого я использую запрос INSERT INTO SELECT:

<cfquery name="archiveDeletion" datasource="#application.dsn#">
    INSERT INTO deletedCylinderContentRecords (air_emissions, barcode, building, capacity, Carcinogen, carcinogen_comment, carcinogen_type, cas, casORmixture, chemicalname, concentration, containermaterial, containertype, cyanide, CylinderID, dotdivision, dothazardclass, dothazardclassSub, expirationdate, flashpoint, formula, grade, HMAR_ID, hydroflouric_acid, HydrostaticTestDate, HydrostaticTestDueDate, initial_quantity, inventoried, isdeleted, lastupdated, LeakTestDate, location, manufacturer, ModifiedBy, msds, MSDS_Scan, MSN, Mutagen, nfpablue, nfpared, nfpawater, nfpayellow, ownerid, PeroxideConcentration, PeroxideFormers, PeroxideTestDate, PeroxideTestDueDate, phaseID, PList, price, Purchase_Scan, Purchase_Scan_Link, purchasedate, remarks, ResearchSampleNo, room, sewer, shelf, ShockSensitive, specificgravity, spillage, spillclass, SPInspect, SPInspectDate, SPInterval, stocknumber, StorageRemarks, Teratogen, Undelete, units, usage_comments, usage_transferred, usage_transferred_to, usedinprocess, Validate, ValidateBy, ValidateDate, vendor, VendorNumber, waste, deleterName, timeDeleted, reasonDeleted)
    SELECT * FROM containers WHERE barcode = '#session.barcode#',
    <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#getDeleterName.last_name#, #getDeleterName.first_name# #getDeleterName.middle_initial#.">,
    SYSDATETIME(),
   <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#Form.deleteReason5#">
</cfquery>

Из приведенного выше запроса видно, что все, кроме трех столбцов, вставлены из исходной таблицы в таблицу архивации. Это последние три: deleterName, timeDeleted и reasonDeleted. Поэтому после части SELECT * я добавляю три нужных столбца, пару с тегами <cfqueryparam>. Мой синтаксис должен быть неправильным, так как я получаю эту ошибку:

Неверный синтаксис рядом с ','.

Какой правильный синтаксис? Нужно ли мне другое ключевое слово SELECT? Я ничего не могу найти по этому поводу.

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

Благодаря тому, что @SeanLange сказал в комментариях, я нашел решение. Я добавил три дополнительных столбца, не являющихся частью таблицы containers, в запрос SELECT, и, конечно же, это сработало. Я также явно назвал столбцы вместо использования селектора *, поэтому окончательное решение выглядело так:

<cfquery name="archiveDeletion" datasource="#application.dsn#">
    INSERT INTO deletedCylinderContentRecords (air_emissions, barcode, building, capacity, 
    Carcinogen, carcinogen_comment, carcinogen_type, cas, casORmixture, chemicalname, concentration,
    containermaterial, containertype, cyanide, CylinderID, dotdivision, dothazardclass,
    dothazardclassSub, expirationdate, flashpoint, formula, grade, HMAR_ID, hydroflouric_acid,
    HydrostaticTestDate, HydrostaticTestDueDate, initial_quantity, inventoried, isdeleted, lastupdated, 
    LeakTestDate, location, manufacturer, ModifiedBy, msds, MSDS_Scan, MSN, Mutagen, nfpablue, nfpared,
    nfpawater, nfpayellow, ownerid, PeroxideConcentration, PeroxideFormers, PeroxideTestDate,
    PeroxideTestDueDate, phaseID, PList, price, Purchase_Scan, Purchase_Scan_Link, purchasedate,
    remarks, ResearchSampleNo, room, sewer, shelf, ShockSensitive, specificgravity, spillage,
    spillclass, SPInspect, SPInspectDate, SPInterval, stocknumber, StorageRemarks, Teratogen,
    Undelete, units, usage_comments, usage_transferred, usage_transferred_to, usedinprocess, Validate, 
    ValidateBy, ValidateDate, vendor, VendorNumber, waste, deleterName, timeDeleted, reasonDeleted)
    SELECT air_emissions, barcode, building, capacity, Carcinogen, carcinogen_comment, carcinogen_type,
    cas, casORmixture, chemicalname, concentration, containermaterial, containertype, cyanide, 
    CylinderID, dotdivision, dothazardclass, dothazardclassSub, expirationdate, flashpoint, formula,
    grade, HMAR_ID, hydroflouric_acid, HydrostaticTestDate, HydrostaticTestDueDate, initial_quantity,
    inventoried, isdeleted, lastupdated, LeakTestDate, location, manufacturer, ModifiedBy, msds, 
    MSDS_Scan, MSN, Mutagen, nfpablue, nfpared, nfpawater, nfpayellow, ownerid, PeroxideConcentration,
    PeroxideFormers, PeroxideTestDate, PeroxideTestDueDate, phaseID, PList, price, Purchase_Scan,
    Purchase_Scan_Link, purchasedate, remarks, ResearchSampleNo, room, sewer, shelf, ShockSensitive,
    specificgravity, spillage, spillclass, SPInspect, SPInspectDate, SPInterval, stocknumber,
    StorageRemarks, Teratogen, Undelete, units, usage_comments, usage_transferred, usage_transferred_to, 
    usedinprocess, Validate, ValidateBy, ValidateDate, vendor, VendorNumber, waste,
    <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#getDeleterName.last_name#, #getDeleterName.first_name# #getDeleterName.middle_initial#.">,
    SYSDATETIME(),
    <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#Form.deleteReason5#">
    FROM containers WHERE barcode = '#session.barcode#'
</cfquery>
0 голосов
/ 07 февраля 2020

@ Макс Voisard, я go через ваш код. Я обнаружил еще несколько проблем во всем вашем запросе.

  • В вашем запросе выбора у вас есть условие WHERE, например WHERE barcode = '# session.barcode #', (нам здесь не нужна запятая) после того, как вы написали некоторые cfqueryparam. Что совершенно неправильно. Вы должны использовать оператор И / ИЛИ , чтобы проверить следующее условие с некоторыми столбцами.
  • В вашем первом queryParam вы использовали список значений в атрибуте значения, тогда вы должны использовать "List = true" . Таким образом, ваш запрос должен выглядеть так:

      WHERE barcode = '#session.barcode#' 
                AND / OR 
      columnName = <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#getDeleterName.last_name#, #getDeleterName.first_name# #getDeleterName.middle_initial#." list='true'>
    
  • И, как указано выше, все предложения не используйте * в вашем запросе SELECT. Попробуйте поставить упомянутые имена столбцов. Вот мой пример запроса для вас с некоторыми условиями.

INSERT INTO table1 (id, name, age) SELECT id, name, age FROM table2 WHERE age <10 AND id <9 </p>

Надеюсь, это поможет вам больше :). Спасибо.

0 голосов
/ 06 февраля 2020

Этот комментарий слишком длинный, чтобы помещаться в комментарии

Позвольте мне сделать его читабельным

<cfquery name="archiveDeletion" datasource="#application.dsn#">
    INSERT INTO deletedCylinderContentRecords (
      air_emissions, barcode, building, capacity, Carcinogen, 
      carcinogen_comment, carcinogen_type, cas, casORmixture, 
      chemicalname, concentration, containermaterial, containertype, 
      cyanide, CylinderID, dotdivision, dothazardclass,
      dothazardclassSub, expirationdate, flashpoint, formula, grade,
      HMAR_ID, hydroflouric_acid, HydrostaticTestDate, 
      HydrostaticTestDueDate, initial_quantity, inventoried, 
      isdeleted, lastupdated, LeakTestDate, location, manufacturer,
      ModifiedBy, msds, MSDS_Scan, MSN, Mutagen, nfpablue, nfpared,
      nfpawater, nfpayellow, ownerid, PeroxideConcentration, 
      PeroxideFormers, PeroxideTestDate, PeroxideTestDueDate, phaseID,
      PList, price, Purchase_Scan, Purchase_Scan_Link, purchasedate, 
      remarks, ResearchSampleNo, room, sewer, shelf, ShockSensitive, 
      specificgravity, spillage, spillclass, SPInspect, SPInspectDate, 
      SPInterval, stocknumber, StorageRemarks, Teratogen, Undelete, 
      units, usage_comments, usage_transferred, usage_transferred_to, 
      usedinprocess, Validate, ValidateBy, ValidateDate, vendor, 
      VendorNumber, waste, deleterName, timeDeleted, reasonDeleted)
    SELECT * 
    FROM containers 
    WHERE barcode = '#session.barcode#',
    <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#getDeleterName.last_name#, #getDeleterName.first_name# #getDeleterName.middle_initial#.">,
    SYSDATETIME(),
   <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#Form.deleteReason5#">
</cfquery>

Вернуться к текущей проблеме.

У меня есть нет деа, что это должно быть. Вы пытаетесь сделать кучу ANDs? Вы пытаетесь добавить больше столбцов для выбора? Почему штрих-код отсутствует в cfqueryparam Парам, который куча данных выглядит действительно странно. Я ожидаю увидеть три параметра для трех частей имени. С другой стороны, возможно, именно так хранятся данные. И последнее, но не менее важное: я думаю, что все столбцы должны быть перечислены в операторе выбора. Не уверен * сработает (могу ошибаться)

    SELECT * 
    FROM containers 
    WHERE barcode = '#session.barcode#',
    <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#getDeleterName.last_name#, #getDeleterName.first_name# #getDeleterName.middle_initial#.">,
    SYSDATETIME(),
   <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#Form.deleteReason5#">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...