代码之家  ›  专栏  ›  技术社区  ›  shamalaia

与WHERE连接-拆分WHERE子句

  •  0
  • shamalaia  · 技术社区  · 6 年前

    at this link

    代码如下:

    SELECT ch.name,sh.name
    FROM character ch 
      INNER JOIN character_tv_show chat
                     ON ch.id = chat.character_id
                          INNER JOIN tv_show sh
                                         ON chat.tv_show_id=sh.id
                                         WHERE ch.name != "Willow Rosenberg" AND sh.name !="How I Met Your Mother"
    ;
    

    SELECT ch.name,sh.name
    FROM character ch 
    WHERE ch.name != "Willow Rosenberg" /*This here*/
      INNER JOIN character_tv_show chat
                     ON ch.id = chat.character_id
                          INNER JOIN tv_show sh
                                         ON chat.tv_show_id=sh.id
                                         WHERE sh.name !="How I Met Your Mother"
    ;
    

    因为我以为这样就只有桌子了 character

    有什么意义吗?

    有没有办法“分家” WHERE 连接多个表时使用子句?

    4 回复  |  直到 6 年前
        1
  •  1
  •   dotNET    6 年前

    想想 JOIN s作为两个表的叉积,使用 ON 条款。你的 WHERE 子句然后应用于结果集,而不是应用于参与联接的各个表。

    enter image description here

    哪里 在其中一个联接表上,必须使用子查询。然后,该子查询的过滤结果将被视为普通表,并与 真实的 表格使用 再一次。

    如果您这样做是为了提高性能,请记住,在标准中,连接几乎总是更快 加入 与子查询进行比较,以获得正确索引的表。您会发现,使用JOIN的查询将比使用子查询的查询快几个数量级,但极少数情况除外。

        2
  •  1
  •   Evgeniy Belov    6 年前

    可以使用子查询

    SELECT ch.name,sh.name
      FROM (
            SELECT ch.name
            FROM character ch 
            WHERE ch.name != "Willow Rosenberg") ch
      INNER JOIN character_tv_show chat
                 ON ch.id = chat.character_id
      INNER JOIN tv_show sh
                 ON chat.tv_show_id=sh.id
      WHERE sh.name !="How I Met Your Mother"
    

    第一个查询将由数据库服务器优化,并且可能只从字符表中选择需要的行

        3
  •  1
  •   melpomene    6 年前

    JOIN WHERE 子句与添加另一个子句没有任何区别 AND 条件(这就是不允许的原因)。

    你的想法不错,但这不是数据库的实际工作方式。

        4
  •  1
  •   LukStorms    6 年前

    SELECT WHERE 条款。
    在加入之后。

    但是您可以在所加入的子查询中有额外的WHERE子句。

    有时,添加到WHERE子句中的条件可以移动到连接的上。

    例如,下面的查询将返回相同的结果

    SELECT *
    FROM Table1 AS t1
    JOIN Table2 AS t2 ON t2.ID = t1.table2ID
    WHERE t1.Col1 = 'foo'
    AND t2.Col1 = 'bar'
    
    SELECT *
    FROM 
    (
       SELECT * 
       FROM Table1 
       WHERE Col1 = 'foo'
    ) AS t1
    JOIN Table2 AS t2 ON t2.ID = t1.table2ID
    WHERE t2.Col1 = 'bar'
    
    SELECT *
    FROM Table1 AS t1
    JOIN Table2 AS t2 ON (t2.ID = t1.table2ID AND t2.Col1 = 'bar')
    WHERE t1.Col1 = 'foo'