【问题标题】:MySQL - INSERT with subQuery IF NOT EXISTSMySQL - 如果不存在,则使用子查询插入
【发布时间】:2018-10-09 16:41:30
【问题描述】:

我很困惑,SQL 不是我的强项。

我一直在查看以下答案,但我可以让我自己的查询工作:

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name = 'Rupert'
) LIMIT 1;

INSERT INTO `table` (value1, value2) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE value1='stuff for value1' AND value2='stuff for value2') 
LIMIT 1 

我想将子查询的结果插入新表(匹配),这是我的查询:

INSERT INTO matches (fk_object_id, object_adress, fk_lookout_id, lookout_name)
    (SELECT o.id as oid, o.adress as oa, l.id as lid, l.first_name as lfn 
    FROM geo_lookout gl
    JOIN geo_object go ON go.`fk_geo_id` = gl.`fk_geo_id`
    JOIN object o ON o.id = go.`fk_object_id`
    JOIN attri_object ao ON ao.`fk_object_id` = go.`fk_object_id`
    JOIN attri_lookout al ON al.`fk_attri_id` = ao.`fk_attri_id`
    JOIN lookout l ON l.`id` = al.`fk_lookout_id`
    WHERE o.`have_size` <= l.`max_size`
    AND o.`have_size` >= l.`min_size`
    GROUP BY o.id)
WHERE NOT EXISTS (SELECT * FROM matches WHERE fk_object_id = oid AND fk_lookout_id = lid)
LIMIT 1

我总是收到以下错误:

您的 SQL 语法有错误;检查手册 对应于您的 MariaDB 服务器版本,以便使用正确的语法 附近 'WHERE NOT EXISTS (SELECT * FROM 匹配 WHERE fk_object_id = oid AND fk_lookout_' 在第 12 行

包含所有 JOINS 的大 SELECT 查询本身运行良好:

oid        oa          lid         lfn
45    aGoodStreet       32    Andrew Phillis
44    aGoodStreet       32    Andrew Phillis

你们比我看得更清楚吗?可能:)

亲切的问候

【问题讨论】:

  • 请用表结构添加一些示例数据和预期结果。

标签: mysql sql


【解决方案1】:

为什么select 周围有括号?大概,你打算:

INSERT INTO matches (fk_object_id, object_adress, fk_lookout_id, lookout_name)
    SELECT o.id as oid, o.adress as oa, l.id as lid, l.first_name as lfn 
    FROM geo_lookout gl
    JOIN geo_object go ON go.`fk_geo_id` = gl.`fk_geo_id`
    JOIN object o ON o.id = go.`fk_object_id`
    JOIN attri_object ao ON ao.`fk_object_id` = go.`fk_object_id`
    JOIN attri_lookout al ON al.`fk_attri_id` = ao.`fk_attri_id`
    JOIN lookout l ON l.`id` = al.`fk_lookout_id`
    WHERE o.`have_size` <= l.`max_size` AND
          o.`have_size` >= l.`min_size` AND
          NOT EXISTS (SELECT * FROM matches m WHERE m.fk_object_id = o.oid AND m.fk_lookout_id = l.lid)
    GROUP BY o.id
    LIMIT 1;

请注意,我必须在子查询中猜测列的来源。限定所有列引用。

【讨论】:

  • 感谢您的回复。实际上,括号只是去了那里,因为我试图模仿我发布的参考代码。不幸的是,没有它们也一样。
  • @SimonWikenståhl 。 . .你是说这个版本返回同样的错误?我不这么认为。它不会丢失任何子查询的别名。
【解决方案2】:

感谢@Gordon Linoff,查询现在可以正常工作了!

非常感谢!

这是有效的查询:

INSERT INTO matches (fk_object_id, object_adress, fk_lookout_id, lookout_name)
    SELECT o.id as oid, o.adress as oa, l.id as lid, l.first_name as lfn 
    FROM geo_lookout gl
    JOIN geo_object go ON go.`fk_geo_id` = gl.`fk_geo_id`
    JOIN object o ON o.id = go.`fk_object_id`
    JOIN attri_object ao ON ao.`fk_object_id` = go.`fk_object_id`
    JOIN attri_lookout al ON al.`fk_attri_id` = ao.`fk_attri_id`
    JOIN lookout l ON l.`id` = al.`fk_lookout_id`
    WHERE o.`have_size` <= l.`max_size` AND
          o.`have_size` >= l.`min_size` AND
          NOT EXISTS (SELECT * FROM matches m JOIN object ON object.id = m.`fk_object_id` JOIN lookout ON lookout.id = m.`fk_lookout_id` WHERE m.fk_object_id = object.id AND m.fk_lookout_id = lookout.id)
    GROUP BY o.id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2014-04-14
    • 2013-01-10
    • 1970-01-01
    • 2011-09-10
    • 2011-07-14
    相关资源
    最近更新 更多