我有两张桌子
主题:
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”值但不存在在线程表中
答案 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;
请注意,需要进行完全外部联接通常可以表明您的关系模型存在问题,因为这意味着您不知道表格之间的关键关系。
修改强>
如果您使用的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)