sql并排合并表,没有共同点
Posted
技术标签:
【中文标题】sql并排合并表,没有共同点【英文标题】:sql merge tables side-by-side with nothing in common 【发布时间】:2013-07-12 18:31:46 【问题描述】:我正在寻找关于如何合并两个没有任何共同点的表的 sql 答案。
So let's say you have these two tables without anything in common:
Guys Girls
id name id name
--- ------ ---- ------
1 abraham 5 sarah
2 isaak 6 rachel
3 jacob 7 rebeka
8 leah
and you want to merge them side-by-side like this:
Couples
id name id name
--- ------ --- ------
1 abraham 5 sarah
2 isaak 6 rachel
3 jacob 7 rebeka
8 leah
How can this be done?
我正在寻找关于如何合并两个没有任何共同点的表的 sql 答案。
【问题讨论】:
我有几个想法,但哪一个是正确的取决于你在这里想要实现的目标。如果你只是像这样把它们放在一起,你将没有任何用处。了解上下文有助于决定最佳行动方案。您的头脑中必须有一些关于如何匹配它们的逻辑,诀窍是将其放入数据库中。在你的例子中,你是在匹配男朋友/女朋友来产生一对吗? 我的问题与 David Stratton 的礼貌问题相同,但更直白一点:即使可以,您为什么还要这样做? 我支持这个....为什么? 好吧,这不是最好的例子。我正在连接到一个数据库,该数据库在各种孤儿表中用每个人的大量属性来影响 ERP。我知道这不应该发生在 ERP 中,但它太多了。其中一些属性是查找表中字段的解码,整个事情变得不必要地复杂。无论如何,由于上述原因,我有 8 个无法加入的查询。一旦我得到结果,需要将它们作为单个记录带回来。所以,我不想打 db 8 次,而是想打一次。 我想这样做是为了用外部源生成的字符串键填充主键字段。我不在乎哪条记录得到哪个密钥,但我希望所有 20,000 条记录都有一个密钥。就像将电子表格的一列粘贴到另一列旁边一样。 【参考方案1】:您可以通过创建一个键(即行号)并加入它来完成此操作。
大多数 SQL 方言都支持row_number()
函数。这是一种使用它的方法:
select gu.id, gu.name, gi.id, gi.name
from (select g.*, row_number() over (order by id) as seqnum
from guys g
) gu full outer join
(select g.*, row_number() over (order by id) as seqnum
from girls g
) gi
on gu.seqnum = gi.seqnum;
【讨论】:
【参考方案2】:只是因为我还是写了它,使用 CTE 的替代方案;
WITH guys2 AS ( SELECT id,name,ROW_NUMBER() OVER (ORDER BY id) rn FROM guys),
girls2 AS ( SELECT id,name,ROW_NUMBER() OVER (ORDER BY id) rn FROM girls)
SELECT guys2.id guyid, guys2.name guyname,
girls2.id girlid, girls2.name girlname
FROM guys2 FULL OUTER JOIN girls2 ON guys2.rn = girls2.rn
ORDER BY COALESCE(guys2.rn, girls2.rn);
An SQLfiddle to test with.
【讨论】:
【参考方案3】:假设,您想在示例中将男孩与女孩配对,并在记录之间建立某种有意义的关系(不是双关语)...
通常,您会使用单独的表格来表示两者之间的关联(关系)。
这不会给你一个物理表,但它可以让你编写一个代表最终结果的 SQL 查询:
SELECT Girls.ID AS GirlId, Girls.Name AS GirlName, Guys.ID AS GuyId, Guys.Name AS GuyName
FROM Couples INNER JOIN
Girls ON Couples.GirlId = Girls.ID INNER JOIN
Guys ON Couples.GuyId = Guys.ID
然后您可以使用 Select Into 语法动态创建表
SELECT Girls.ID AS GirlId, Girls.Name AS GirlName, Guys.ID AS GuyId, Guys.Name AS GuyName
INTO MyNewTable
FROM Couples INNER JOIN
Girls ON Couples.GirlId = Girls.ID INNER JOIN
Guys ON Couples.GuyId = Guys.ID
(但标准规范化规则会说最好将它们保存在不同的表中,而不是创建临时表,除非出于性能原因不这样做。)
【讨论】:
【参考方案4】:我一直都需要这个——使用表格中的输入在 Excel 中创建模板。这从一张包含我的区域的表中提取,另一张包含一年中的季度。结果为每个季度/期间提供了一个地区名称。
SELECT b.quarter_qty, a.mkt_name FROM TBL_MKTS a, TBL_PERIODS b
【讨论】:
这是这个问题的答案还是您提出新问题?如果您有新问题,那么ask new question 不,这将返回表 a 和 b 的笛卡尔积。以上是关于sql并排合并表,没有共同点的主要内容,如果未能解决你的问题,请参考以下文章
SQL JOIN,所有来自 t1 和所有来自 t2,除了 t1 的共同点