【问题标题】:Trying to insert data where not exists throwing: #1242 - Subquery returns more than 1 row尝试在不存在的地方插入数据抛出:#1242 - 子查询返回超过 1 行
【发布时间】:2019-03-30 22:14:28
【问题描述】:

我正在从一个表中获取数据并尝试将其插入到另一个表中,如果数据不存在,则当“不存在”仅返回 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;

【问题讨论】:

    标签: mysql sql sql-insert not-exists


    【解决方案1】:

    我觉得麻烦就在这里

    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
    

    如果您的 MySQL 版本支持,您可以尝试使用 MINUS 运算符

    --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
    

    请参阅以下有关 MySQL 中的 MINUS 的文章 - 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
        )
    

    希望我理解正确。

    也许您需要为带有Project_ID 的子查询添加DISTINCT

      (
        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
    

    【讨论】:

    • 啊伙计,你是个传奇。你的第一个建议就像一个魅力!打算研究一段时间以改进我的做事方式。非常感谢!
    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 2018-03-26
    • 2013-02-27
    • 2015-04-11
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多