【发布时间】:2018-10-11 11:48:12
【问题描述】:
我遇到了与this question 中描述的几乎相同的问题。我有两个行数相同的表,我想将它们一一连接在一起。
表是有序的,如果可能的话,我想在加入后保持这个顺序。
MSSql 有一个基于 rowid 的解决方案,但在 SQLite 中,如果表来自 WITH 语句(或 RECURSIVE WITH),则无法使用 rowid。
保证两个表有完全相同的行数,但这个数字是事先不知道的。同样重要的是要注意,相同的元素可能出现两次以上。结果是有序的,但没有一列是唯一的。
示例代码:
WITH
table_a (n) AS (
SELECT 2
UNION ALL
SELECT 4
UNION ALL
SELECT 5
),
table_b (s) AS (
SELECT 'valuex'
UNION ALL
SELECT 'valuey'
UNION ALL
SELECT 'valuez'
)
SELECT table_a.n, table_b.s
FROM table_a
LEFT JOIN table_b ON ( table_a.rowid = table_b.rowid )
我想要达到的结果是:
(2, 'valuex'),
(4, 'valuey'),
(5, 'valuez')
SQLFiddle:http://sqlfiddle.com/#!5/9eecb7/6888
【问题讨论】:
-
回复:“结果是有序的,但没有一列是唯一的。” - 不确定您是否已经知道这一切,但在 SQL 中,如果没有明确定义
ORDER BY,则未定义行返回的顺序。如果指定了ORDER BY,但不同行之间的值相同,则未定义这些行返回的顺序。因此,鉴于此,连接两个表的方式将无法预测/确定。 -
(我对上述评论的看法:)“桌子是有序的”是什么意思?表没有排序,结果集[原文如此]。没有“保留”的命令。即使有实现顺序,也无法通过查询访问。请说清楚。请注意,您似乎有一些误解。 (例如,random(),不保证每个查询在给定参数上多次调用运算符。)
标签: sql join sqlite sql-order-by