2014-12-04 72 views
1

我有3个表名为A,B和C.表A有列a。表B列a,b。表C列a,c。这些表中包含类似下面的数据:SQL JOIN或UNION还是什么?

enter image description here

我想从A,B,C中的所有数据,其中a = 1

我的期望输出应该如下:

enter image description here

但我从SSMS得到的结果如下:

enter image description here

我应该如何重构我的SQL来获得我想要的输出?

例如我不想在列中重复的值

+1

*“我不想在列中重复值”*您想要一个非常不寻常的东西,我认为在SQL中创建所需的输出是困难的和不可能的。你能解释一下你正在操作的数据,它是如何关联的,以及为什么这个特定的输出格式必须是SQL查询的结果? – Tomalak 2014-12-04 11:32:23

+0

@Tomalak请看看我接受的** @ Gordon Linoff **的回答。可能是那**难**。但**不可能**? – autopilot 2014-12-06 03:21:17

+0

“不可能”取决于所使用的数据库服务器。你没有回答我的问题。我真的很想知道这是什么。对我来说,这看起来像一个数据库设计错误和一般滥用关系数据库范例。 – Tomalak 2014-12-06 05:17:11

回答

2

您需要加入这些值,但不仅在a值上,而且在该位置上。 SQL表格表示无序集合。我将假定bc列表示排序。

select a.a, b.b, c.c 
from (select a.*, row_number() over (order by a) as seqnum 
     from a 
    ) a full outer join 
    (select b.*, row_number() over (partition by a order by b) as seqnum 
     from b 
    ) b 
    on a.a = b.a and a.seqnum = b.seqnum full outer join 
    (select c.*, row_number() over (partition by a order by c) as seqnum 
     from c 
    ) c 
    on c.a = coalesce(a.a, b.a) and c.seqnum = coalesce(a.seqnum, b.seqnum) 
where coalesce(a.a, b.a, c.a) = 1; 
+0

问候大师@Gordon Linoff!确切地说,我一直在寻找.... – autopilot 2014-12-06 03:18:49

+0

你可以请你解释一下关于你的查询! **如果我没有在b和c列中订购,该怎么办?** – autopilot 2014-12-06 03:50:46

+0

@autopilot。 。 。我不确定需要解释什么。子查询会为每个表的“a”值添加一个连续编号。然后使用这个连续的数字作为“完全外部连接”的条件的一部分,该连接保留了两个表中的所有行,即使没有匹配时也是如此。 – 2014-12-06 03:55:25