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

问题描述 投票:1回答:4

我有两张桌子

主题:

i_id thread_note seq_id
 1       ABC        2
 2       CDE        2
 3       FGH        1
 4       IJK        2

笔记:

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

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

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

sql sql-server
4个回答
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;

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


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列表。


-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)
© www.soinside.com 2019 - 2024. All rights reserved.