将两个表合并为一个输出sql查询

时间:2018-03-02 09:43:24

标签: sql sql-server

我有两张桌子

主题:

i_id  note_text entered_date
 1      stack     09/08/2017
 5      queue     07/07/2014
 3      push      09/07/1996

注意:

i_id  thread_note  seq_id   note_text  entered_date
 1       ABC         2        stack     09/08/2017
 2       CDE         2        null        null
 3       FGH         1        push      09/07/1996
 4       IJK         2        null        null   
 5       null        null     queue     07/07/2014

我希望输出为

{{1}}

我如何实现这一目标?这些表彼此无关。

注意:这与大多数类似于此问题的问题不同,因为在线程表中存在一些“i_id”值但在notes表中没有,并且在notes表中存在一些“i_id”值但不存在在线程表中

4 个答案:

答案 0 :(得分:1)

使用完整的外部联接:

SELECT
    COALESCE(t.i_id, n.i_id) AS i_id,
    t.thread_note,
    t.seq_id,
    n.note_text,
    n.entered_date
FROM Threads t
FULL OUTER JOIN Notes n
    ON n.i_id = t.i_id
ORDER BY
    i_id;

请注意,需要进行完全外部联接通常可以表明您的关系模型存在问题,因为这意味着您不知道表格之间的关键关系。

Demo

修改

如果您使用的MySQL不支持完全外连接,我们仍然可以模拟一个:

SELECT *
FROM Threads t
LEFT JOIN Notes n
    ON n.i_id = t.i_id
UNION ALL
SELECT *
FROM Threads t
RIGHT JOIN Notes n
    ON n.i_id = t.i_id
WHERE t.i_id IS NULL;

答案 1 :(得分:0)

首先,您需要从子查询中的所有表中获取所有i_id。获得行后,将其连接到两个表以获取所需的列,

SELECT  a.i_id,
        b.thread_note,
        b.seq_id,
        c.Note_text,
        c.entered_date
FROM
        (
            SELECT i_id FROM Threads UNION 
            SELECT i_id FROM Notes
        ) a
        LEFT JOIN Threads b
            ON a.i_id = b.i_id
        LEFT JOIN Notes c
            ON a.i_id = c.i_id
ORDER BY a.i_id

这里是Demo

答案 2 :(得分:0)

你可以在这里使用FULL OUTER JOIN。如果我制作一些测试数据:

DECLARE @threads TABLE (i_id INT, thread_note NVARCHAR(3), seq_id INT);
INSERT INTO @threads SELECT 1, 'ABC', 2;
INSERT INTO @threads SELECT 2, 'CDE', 2;
INSERT INTO @threads SELECT 3, 'FGH', 1;
INSERT INTO @threads SELECT 4, 'IJK', 2;
DECLARE @notes TABLE (i_id INT, note_text NVARCHAR(10), entered_date DATE);
INSERT INTO @notes SELECT 1, 'stack', '20170809';
INSERT INTO @notes SELECT 5, 'queue', '20140707';
INSERT INTO @notes SELECT 3, 'push', '19960709';

然后我的查询就是:

SELECT
    ISNULL(t.i_id, n.i_id) AS i_id,
    t.thread_note,
    t.seq_id,
    n.note_text,
    n.entered_date
FROM
    @threads t
    FULL OUTER JOIN @notes n ON n.i_id = t.i_id
ORDER BY
    ISNULL(t.i_id, n.i_id);

无需列出唯一的I_ids列表。

答案 3 :(得分:-1)

使用以下查询

select Isnull(n.i_id,t.i_id), [thread_note],seq_id,Notetest,Enddate  
from [dbo].[note] n  FULL OUTER JOIN [dbo].[thread] t on n.[i_id]=t.[i_id]
order by Isnull(n.i_id,t.i_id)