【问题标题】:How can i join two tables after filtering过滤后如何加入两个表
【发布时间】:2018-05-20 03:52:24
【问题描述】:

如何在使用某些条件过滤每个表并获得过滤结果后加入两个表。

尝试过代码但显示语法错误

SELECT * 
FROM Table1 
WHERE flag1 = 0  
JOIN SELECT * 
     FROM TABLE2 
     where flag2 = 0 on Table1.email = TABLE2.email

【问题讨论】:

  • select ... from t1 join t2 on ... where...,即每个 SELECT 只有一个 WHERE。
  • @jarlh 抱歉,我不想要这个。通过在整个表上使用连接,我遇到了一些时间复杂性问题。
  • 我的建议有什么问题?这就是它应该做的方式。
  • @AdityaSrivastava - 就这么简单。将 where 放在 on 子句之后。数据库现在很聪明。他们会看到要过滤的内容,然后加入

标签: mysql sql join filter where


【解决方案1】:
SELECT *  
FROM Table1 as t1
join Table2 as t2 on t1.orderlist_email = t2.email
where flag1 = 0 
and flag2 = 0

正确的加入会是这样的。

【讨论】:

  • flag2 在哪里?
  • @Sami:主要答案与 join 和 where 子句有关。无论如何我更新了答案
【解决方案2】:

将两个Select Statements视为SUBQUERIES,将这两个子查询的结果视为两个不同的表,然后尝试join。

SELECT * FROM 
(SELECT * FROM Table1 where flag1 = 0) Table1 
JOIN 
(SELECT * FROM TABLE2 where flag2 = 0) Table2 
on Table1.orderlist_email = TABLE2.email

【讨论】:

    【解决方案3】:

    可能没有足够的(RAM/缓存)空间来保存过滤后的结果,然后将它们合并在一起。它可能比您预期的要慢。

    *技术上可以,但效率不高。

    SELECT * 
    FROM (
        SELECT * FROM Table1 where flag1 = 0
    ) A
    JOIN (
        SELECT * FROM TABLE2 where flag2 = 0
    ) B 
    ON A.orderlist_email = B.email;
    

    但是,我建议您先加入他们,然后再加入。 MySQL(或任何 sql 引擎)会(通常)为您优化它。

    SELECT * 
    FROM Table1
    JOIN TABLE2 
    ON A.orderlist_email = B.email
    WHERE Table1.flag1 = 0 
    AND TABLE2.flag2 = 0;
    

    【讨论】:

      【解决方案4】:

      除非我遗漏了什么,否则这应该很简单。伪代码,但你可以通过几种方式解决这个问题......

      SELECT 
         * 
      FROM 
         Table1 
         JOIN TABLE2 ON Table1.orderlist_email = TABLE2.email
         Table1.flag1 = 0 
         AND TABLE2.flag2 = 0 
      

      或者,您可以将WHERE 条件添加到JOIN,如下所示:

      SELECT 
         * 
      FROM 
         Table1 
         JOIN TABLE2 ON Table1.orderlist_email = TABLE2.email
         AND Table1.flag1 = 0 
         AND TABLE2.flag2 = 0 
      

      我认为您关心的是这是否意味着引擎仍将对两个表执行全面扫描,而不是坚持使用它会尝试加入的“预过滤”集。现代引擎应该足够聪明来解决这些问题,但是根据查询的复杂性,您的里程可能会有所不同。

      【讨论】:

        猜你喜欢
        • 2012-08-21
        • 1970-01-01
        • 1970-01-01
        • 2016-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        相关资源
        最近更新 更多