Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从两个表中选择,如果不存在,则插入其中一个表_Mysql_Sql - Fatal编程技术网

Mysql 从两个表中选择,如果不存在,则插入其中一个表

Mysql 从两个表中选择,如果不存在,则插入其中一个表,mysql,sql,Mysql,Sql,我有三张桌子: Members - Person_id Sites - Site_id Member_multi_site - Person_id - Site_id 我试图做的是在Member\u multi\u Site表中不存在同一行时,将Person\u id和Site\u id插入Member\u multi\u Site表 因此,如果站点表中有3行1、2、3,而成员表中有1行1,则应将它们像这样添加到成员多站点表中: 我通过手动插入站点id使其正常工作,如下所示: 我不知道

我有三张桌子:

Members
 - Person_id
Sites
 - Site_id
Member_multi_site
 - Person_id
 - Site_id
我试图做的是在Member\u multi\u Site表中不存在同一行时,将Person\u id和Site\u id插入Member\u multi\u Site表

因此,如果站点表中有3行1、2、3,而成员表中有1行1,则应将它们像这样添加到成员多站点表中:

我通过手动插入站点id使其正常工作,如下所示:

我不知道如何更改此查询,因此不必手动输入站点id。

如果表不存在,可以交叉连接表并插入行

INSERT INTO
 Member_multi_site (
  Person_id,
  Site_id
 )
SELECT
 Person_id,
 Site_id
FROM
 Members
 CROSS JOIN Sites 
WHERE Person_id NOT IN (SELECT Person_id FROM Member_multi_site)
AND Site_id NOT IN (SELECT Site_id FROM Member_multi_site)
或者您可以使用“不存在”

如果行不存在,可以交叉连接表并插入行

INSERT INTO
 Member_multi_site (
  Person_id,
  Site_id
 )
SELECT
 Person_id,
 Site_id
FROM
 Members
 CROSS JOIN Sites 
WHERE Person_id NOT IN (SELECT Person_id FROM Member_multi_site)
AND Site_id NOT IN (SELECT Site_id FROM Member_multi_site)
或者您可以使用“不存在”


请在测试环境中检查以下SQL脚本 我希望有帮助

insert into Member_multi_site (
    Person_id, Site_id
)
select
    t.Person_id, t.Site_id
from (
    select Person_id, Site_id from Members, Sites
) t
left join Member_multi_site m 
    on m.Person_id = t.Person_id and 
       m.Site_id = t.Site_id
where m.Site_id is null

请在测试环境中检查以下SQL脚本 我希望有帮助

insert into Member_multi_site (
    Person_id, Site_id
)
select
    t.Person_id, t.Site_id
from (
    select Person_id, Site_id from Members, Sites
) t
left join Member_multi_site m 
    on m.Person_id = t.Person_id and 
       m.Site_id = t.Site_id
where m.Site_id is null

你的错误是什么?插入的最后一列后面有一个逗号?是的,从性能角度来看,您的两个查询似乎都比Eraper的答案慢了一点,并且在服务器上使用了更多的操作,但是您的查询的可读性要好得多。另一个注记。第一次运行后的第一次查询,如果尝试从Member_multi_site表中删除几行并再次执行,则不会填充已删除的行。您的第二个查询正确地执行了该操作。您得到的错误是什么?插入的最后一列后面有一个逗号?是的,从性能角度来看,您的两个查询似乎都比Eraper的答案慢了一点,并且在服务器上使用了更多的操作,但是您的查询的可读性要好得多。另一个注记。第一次运行后的第一次查询,如果尝试从Member_multi_site表中删除几行并再次执行,则不会填充已删除的行。您的第二个查询正确地执行了该操作。感谢您的查询,但是它不会检查表成员\u multi\u siteHello中是否已存在该行,左侧的“连接到成员\u multi\u site”和WHERE子句将检查成员\u multi\u site行并删除要再次插入的现有行。请再测试一次。我尝试了不同的情况,每次都得到了想要的结果。如果我运行两次查询,它将插入两次数据。已对此进行测试。请检查WHERE子句,其中m.Site_id为null。别名或列名是否为false?您可能可以使用这些工具。感谢您的查询,但是它不会检查表成员\u multi\u siteHello中是否已经存在该行,左侧的“连接到成员\u multi\u site”和WHERE子句将检查成员\u multi\u site行并删除要再次插入的现有行。请再测试一次。我尝试了不同的情况,每次都得到了想要的结果。如果我运行两次查询,它将插入两次数据。已对此进行测试。请检查WHERE子句,其中m.Site_id为null。别名或列名是否为false?也许你可以玩这些。
insert into Member_multi_site (
    Person_id, Site_id
)
select
    t.Person_id, t.Site_id
from (
    select Person_id, Site_id from Members, Sites
) t
left join Member_multi_site m 
    on m.Person_id = t.Person_id and 
       m.Site_id = t.Site_id
where m.Site_id is null