Оператор INSERT добавить несколько одинаковых строк - PullRequest
0 голосов
/ 24 октября 2018

Я использую веб-сервис для добавления значения в моей базе данных, обычно мой запрос должен добавить только одну строку, но на самом деле он имеет несколько идентичных строк.

Итак, вот мои 2 таблицы: Application.sql

Details.sql

Мой запрос:

INSERT INTO Details 
(SecurityKey, Name, URL, DateLog, Level, Message, Username, ServerName, Port, ServerAdress, RemoteAdress, Logger, Exception, ApplicationID) 
SELECT  
@SecurityKey, @Name, @URL, @DateLog, @Level, @Message, @Username,@ServerName, @Port, @ServerAdress, @RemoteAdress, @Logger, @Exception, @ApplicationID
FROM Details D
INNER JOIN Application A ON @SecurityKey = A.SecurityKey AND @ApplicationID = A.ID

И мой веб-сервис с @ ApplicationID = 14 и @ SecurityKey = "shSfnDOIPM":

{
  "DateLog": "27/02/12",
  "Level": "danger",
  "Message": "ytry",
  "Username": "ghth",
  "ServerName": "zrzrzer",
  "Port": "80",
  "ServerAdress": "36zr",
  "RemoteAdress": "12z",
  "Logger": "rg",
  "Exception": "zr",
  "ApplicationID": 14,
  "Name": "zr",
  "SecurityKey": "shSfnDOIPM",
  "URL": "wwww",
}

Обычно с этой информацией мой запрос должен сортировать только одну строку, но, как вы можете видеть на рисунке «Подробности», он создает много и много строк ...

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы используете запрос INSERT INTO SELECT, но не запускаете JOIN для соединения этих двух таблиц (неявных или явных).При использовании запроса на выборку, который влияет на несколько таблиц, вам нужно иметь N-1, где операторы для их объединения (неявное соединение), или N-1 таких JOIN, чтобы избежать декартового произведения.Декартово произведение = "множественные вставки" в вашем случае, из-за INSERT INTO... SELECT

Я полагаю, вам нужно ВНУТРЕННЕЕ СОЕДИНЕНИЕ и советую вам вообще избегать неявных объединений.

Например, редактированиеВаш запрос:

INSERT INTO Details 
(SecurityKey, Name, URL, DateLog, Level, Message, Username, ServerName, Port, ServerAdress, RemoteAdress, Logger, Exception, ApplicationID) 
SELECT  
@SecurityKey, @Name, @URL, @DateLog, @Level, @Message, @Username,@ServerName, @Port, @ServerAdress, @RemoteAdress, @Logger, @Exception, @ApplicationID
FROM Details D
INNER JOIN Application A ON D.ApplicationID = A.ID 
WHERE A.SecurityKey = @SecurityKey AND A.ID = @ApplicationID

Обратите внимание, что я поместил INNER JOIN и перенес ваше предыдущее "join" в оператор WHERE.

0 голосов
/ 24 октября 2018

Похоже, что вы ссылаетесь на две таблицы в своем запросе, но не объединяете их вместе.Возможно получение декартового произведения в процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...