【问题标题】:How do I join (merge?) several tables?如何加入(合并?)几个表?
【发布时间】:2010-10-16 08:40:24
【问题描述】:

我有三张桌子

AUTHOR_TABLE
-------------
AUTHOR_ID (PK)   AUTHOR_NAME   
1                me
2                you 

ARTICLE_AUTHOR_TABLE
-------------
AUTHOR_ID  ARTICLE_ID  
1          100
2          101


EVENT_AUTHOR_TABLE
------------------------------------------
AUTHOR_ID   EVENT_ID  
1           200
1           201

我只想要一个

RESULTS
-----------------------------------------
AUTHOR_ID AUTHOR_NAME SOURCE_TABLE ID
1         me          article      100
2         you         article      101
1         me          event        200
1         me          event        201 

/* where SOURCE_TABLE would be either "EVENT" or "ARTICLE" */

编辑我真的不想要这个

RESULTS
-----------------------------------------
AUTHOR_ID AUTHOR_NAME EVENT_ID ARTICLE_ID
1         me          NULL         100
2         you         NULL         101
1         me          200         NULL
1         me          201         NULL

任何指针表示赞赏。

谢谢

【问题讨论】:

    标签: sql sql-server join merge


    【解决方案1】:
    SELECT A.AUTHOR_ID, A.AUTHOR_NAME, EA.EVENT_ID, AA.ARTICLE_ID
    FROM AUTHOR_TABLE AS A
        LEFT JOIN ARTICLE_AUTHOR_TABLE AS AA ON AA.AUTHOR_ID = A.AUTHOR_ID
        LEFT JOIN EVENT_AUTHOR_TALBE AS EA ON EA.AUTHOR_ID = A.AUTHOR_ID
    

    【讨论】:

    • 这不会输出他要求的内容...他想在同一结果集中显示文章和事件,而不仅仅是文章。
    • 现在更好了 :) 但是有一种方法可以获取第一个想要的结果;看看我的回答。
    【解决方案2】:
    SELECT
      at.author_id,
      at.author_name,
      'article' AS source_table,
      aat.id
    FROM
      author_table at
      JOIN article_author_table aat
        ON at.author_id = aat.author_id
    
    UNION ALL
    
    SELECT
      at.author_id,
      at.author_name,
      'event' AS source_table,
      eat.id
    FROM
      author_table at
      JOIN event_author_table eat
        ON at.author_id = eat.author_id
    

    【讨论】:

    • 我实际上想像这样将大约 10 个表连接在一起,这是个坏主意吗?
    • 这取决于行数......但是,拥有这么多 UNION 通常是个坏主意。它主要反映了设计不佳的数据库,所以如果可以的话,重组它们是个好主意。如果不是,那将取决于您希望处理多少行。
    • 好的,谢谢,是的,这是我大约 10 年前所做的糟糕的数据库设计(真的来自你的),我只是在写一份临时报告,所以我只能忍受它现在:D
    • 哈哈,好吧,我猜你不是一个人在诅咒旧代码,特别是我们自己写的 ;)
    【解决方案3】:

    因为这是家庭作业,我猜你正在使用 MySQL,read this documentation on the UNION syntax。您所做的基本上是从相似的数据库中执行两个(或更多)查询,并在一个查询中获取结果。

    请注意,结果列必须相同。

    您还可以创建变量来显示您从哪个表调用。

    SELECT AUTHOR_ID, AUTHOR_NAME, `AUTHOR_TABLE` AS SOURCE_TABLE, ID FROM AUTHOR_TABLE
    

    您这样做会影响所有联合,但会更改表名。

    【讨论】:

    • 顺便说一句,因为这是家庭作业,我决定不像 Seb 那样做完整的答案。
    • 顺便说一句,这不是作业,我只是将其简化为看起来像作业:D
    • 当我回答时,它没有被标记为作业:) 我讨厌人们仅仅因为它们看起来很简单而将其他问题标记为作业。
    猜你喜欢
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    相关资源
    最近更新 更多