Попытка вставить данные, где не существует, выбрасывая: # 1242 - Подзапрос возвращает более 1 строки - PullRequest
0 голосов
/ 26 октября 2018

Я получаю данные из одной таблицы и пытаюсь вставить их в другую, если данные еще не существуют, это работает, когда «не существует» возвращает только 1 строку, но если он возвращает более одной, это дает сбой.

Вот мой SQL:

INSERT INTO datatables.SoftwareProjects_Tasks (Description, Project_ID, 
Task_Status) 

SELECT * FROM (SELECT Task FROM datatables.DefaultTask Where Department_Id =
5) as a, (SELECT sp.id FROM datatables.SoftwareProjects AS sp
INNER JOIN S4Admin.Project AS p ON sp.s4_project_id = p.Project_Code
WHERE p.Project_Code = 2294) as b, (SELECT 3) as c

WHERE NOT EXISTS (
SELECT Description, Project_ID FROM SoftwareProjects_Tasks WHERE Description 
= (SELECT Task FROM datatables.DefaultTask Where Department_Id = 5) AND 
Project_ID = (SELECT sp.id FROM datatables.SoftwareProjects AS sp
INNER JOIN S4Admin.Project AS p ON sp.s4_project_id = p.Project_Code
WHERE p.Project_Code = 2294)  
) LIMIT 1;

1 Ответ

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

Я думаю, что проблема здесь

WHERE Description = (SELECT Task FROM datatables.DefaultTask Where Department_Id = 5)
      AND Project_ID = (SELECT sp.id FROM datatables.SoftwareProjects AS sp INNER JOIN S4Admin.Project AS p ON sp.s4_project_id = p.Project_Code WHERE p.Project_Code = 2294)

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

--INSERT INTO datatables.SoftwareProjects_Tasks (Description, Project_ID, Task_Status)
SELECT a.Task,a.Project_ID,3 AS Task_Status
FROM
  (
    SELECT t.Task,p.Project_ID
    FROM datatables.DefaultTask AS t,
      (
        SELECT sp.id AS Project_ID
        FROM datatables.SoftwareProjects AS sp
        JOIN S4Admin.Project AS p ON sp.s4_project_id = p.Project_Code
        WHERE p.Project_Code=2294
      ) AS p
    WHERE t.Department_Id=5
  ) a
LEFT JOIN SoftwareProjects_Tasks b ON b.Description=a.Task AND b.Project_ID=a.Project_ID
WHERE b.Project_ID IS NULL

И вы можете попробовать использовать оператор MINUS, если ваша версия MySQL его поддерживает

--INSERT INTO datatables.SoftwareProjects_Tasks (Description, Project_ID, Task_Status)
SELECT Task,Project_ID,3
FROM
  (
    SELECT t.Task,p.Project_ID
    FROM datatables.DefaultTask AS t,
      (
        SELECT sp.id AS Project_ID
        FROM datatables.SoftwareProjects AS sp
        JOIN S4Admin.Project AS p ON sp.s4_project_id = p.Project_Code
        WHERE p.Project_Code=2294
      ) AS p
    WHERE t.Department_Id=5

    MINUS

    SELECT Description,Project_ID
    FROM SoftwareProjects_Tasks
  ) q

См. Следующую статью о MINUS в MySQL - http://gokhanatil.com/2010/10/minus-and-intersect-in-mysql.html

И еще один вариант с NOT EXISTS

--INSERT INTO datatables.SoftwareProjects_Tasks (Description, Project_ID, Task_Status)
SELECT t.Task,p.Project_ID,3 AS Task_Status
FROM datatables.DefaultTask AS t,
  (
    SELECT sp.id AS Project_ID
    FROM datatables.SoftwareProjects AS sp
    JOIN S4Admin.Project AS p ON sp.s4_project_id = p.Project_Code
    WHERE p.Project_Code=2294
  ) AS p
WHERE t.Department_Id=5
  AND NOT EXISTS(
      SELECT *
      FROM SoftwareProjects_Tasks b
      WHERE b.Description=t.Task AND b.Project_ID=p.Project_ID
    )

Надеюсь, я вас правильно понял.

И, возможно, вам нужно добавить DISTINCT для подзапроса с Project_ID

  (
    SELECT DISTINCT sp.id AS Project_ID
    FROM datatables.SoftwareProjects AS sp
    JOIN S4Admin.Project AS p ON sp.s4_project_id = p.Project_Code
    WHERE p.Project_Code=2294
  ) AS p
...