【问题标题】:How to fetch data from two related tables filter by one table?如何从两个相关表中获取数据按一张表过滤?
【发布时间】:2011-08-26 20:03:50
【问题描述】:

我需要从两个表中获取数据

例如:我有表 test1、test2。 Test1 是父表。我需要获取的数据是存在于 test1 但不存在于 test2 中的数据。我该如何为此编写查询?

select id from test1, test2 where test1.id not in (test2.id);

【问题讨论】:

    标签: mysql


    【解决方案1】:

    执行 LEFT OUTER JOIN:这将为表 1 中的每一行在 table2 中找到相应的行 - 但是当没有找到值时,LEFT OUTER 将导致它返回表 2 值的 NULL 行.然后,只要问那些 table2 字段为 NULL 的地方(因此不存在)。

    select id from test1
    LEFT OUTER JOIN test2 
    ON test1.id = test2.id
    where test2.id IS NULL
    

    您也可以尝试子查询,但这不会更好(通常更糟):

    SELECT id FROM test1 
    WHERE id NOT IN (select id from test2)
    

    【讨论】:

    • @Quassnoi:这就是为什么我说“不是更好”而不是“更糟”;)
    • 如果test2.id 不可为空,则两者具有相同的计划并且执行相同(如果是,则查询具有不同的语义)。我想说的是,您的陈述具有误导性(并且“通常更糟糕”的部分是错误的)并且在MySQL 中提供了关于“可怕的子查询”的神话。
    【解决方案2】:
    SELECT  id
    FROM    test1
    WHERE   id NOT IN
            (
            SELECT  id
            FROM    test2
            )
    

    【讨论】:

    【解决方案3】:

    您可以进行子查询,但也可以使用左连接:

    SELECT test1.*
    FROM test1
    LEFT JOIN test2
    ON test1.id = test2.id
    WHERE test2.id IS NULL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      相关资源
      最近更新 更多