【问题标题】:SQL - OUTER JOIN a UNION-ed tablesSQL - OUTER JOIN 一个 UNION-ed 表
【发布时间】:2019-07-06 18:34:13
【问题描述】:

我是 sql 新手。我有三个表,我想UNION 前两个表然后OUTER JOIN 第三个表的结果,只选择所需的日期。

我已经完成了UNION,但我不知道OUTER JOIN 将如何进入。

这些是我的桌子:

TABLE_1

| ID   | Name     |
-------------------
| 1    | John     |
| 2    | Peter    |
TABLE_2

| ID   | Name     |
-------------------
| 3    | Anne     |
| 4    | May      |
TABLE_3

| ID   | Name     | Date       |
--------------------------------
| 2    | Peter    | 2019-02-13 |
| 3    | Anne     | 2019-02-12 |
| 4    | May      | 2019-02-13 |

这是我现在的查询,它只结合了TABLE_1TABLE_2

SELECT ID, Name FROM TABLE_1 UNION SELECT ID, Name FROM TABLE_2

我希望最终结果返回来自TABLE_1TABLE_2 的ID 和名称,其中TABLE_3 中的日期为2019-02-13

我希望它看起来像这样:

| ID   | Name     | Date       |
--------------------------------
| 2    | Peter    | 2019-02-13 |
| 4    | May      | 2019-02-13 |

【问题讨论】:

    标签: mysql sql join union outer-join


    【解决方案1】:

    这里的一种方法是不使用联合查询,而是使用存在子查询来检查前两个表中的任何一个中是否存在每个 TABLE_3 记录。

    SELECT t3.ID, t3.Name, t3.Date
    FROM TABLE_3 t3
    WHERE
        t3.Date = '2019-02-13' AND (
        EXISTS (SELECT 1 FROM TABLE_1 t1 WHERE t1.ID = t3.ID) OR
        EXISTS (SELECT 1 FROM TABLE_2 t2 WHERE t2.ID = t3.ID));
    

    【讨论】:

    • 我想知道TABLE_3中的ID值与TABLE_1TABLE_2中的值匹配是故意还是巧合...
    • @Nick 假设我们期望良好的表格设计,那么 ID 匹配是必要的,因为在现实生活中两个或更多人可能有相同的名字。
    • 这对 SO 有很大的期望! :-) 如果属实,那么在TABLE_3 中使用名称就毫无意义,这意味着它的表格设计很糟糕。
    • 是的,表格没有标准化。也许 OP 期待基于名称的解决方案,但如果我这样做了,其他人也会发表评论。
    • 不想批评。根据接受的答案,这将非常有效。
    【解决方案2】:

    试试这个,

    SELECT A.* FROM
    (
      SELECT ID, Name FROM TABLE_1 
      UNION
      SELECT ID, Name FROM TABLE_2
     ) AS A
     JOIN TABLE_3
     ON TABLE_3.ID = A.ID AND TABLE_3.DATE = "2019-02-13"
    

    DB Fiddle Here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2014-08-10
      • 2013-06-02
      • 2012-05-22
      • 2021-11-09
      • 2017-08-12
      相关资源
      最近更新 更多