我有一个简单的表OriginalValidLeaders
,其中有一列LeaderType
。
Leader A
Leader B
Leader C
现在,我想将它们彼此随机分配(例如,如果其中一些不交换也可以):
Leader A | Leader C
Leader B | Leader A
Leader C | Leader B
在this question中,解决方案是使用row_number()
,但是由于某些原因,我的SQLite不支持它,因此我尝试了以下查询,并且可以正常工作:
SELECT L.LeaderType, R.LeaderType
FROM OriginalValidLeaders L
LEFT JOIN
(
SELECT LeaderType
FROM OriginalValidLeaders
ORDER BY random()
) R
ON L.rowid = R.rowid;
但是,说实话,这是我的一次运气尝试的结果,我不明白它为什么起作用。最初,我尝试了INNER JOIN
(对我来说更有意义),但没有返回结果。
所以我的问题是:
测试架构/数据(贷记至forpas):
CREATE TABLE OriginalValidLeaders (LeaderType TEXT);
INSERT INTO OriginalValidLeaders (LeaderType) VALUES
('Leader A'), ('Leader B'), ('Leader C');
答案 0 :(得分:1)
您必须使用旧版本的 SQLite 。
的确,同一查询(带有LEFT JOIN
的查询)针对不同版本返回不同的结果:
-------- SQLite 3.8
a | b
-------- | -------
Leader A | Leader B
Leader B | Leader C
Leader C | Leader A
请参见demo。
------- SQLite 3.26
| a | b |
| -------- | --- |
| Leader A | |
| Leader B | |
| Leader C | |
请参见demo。
我不知道这是否是一个错误,现在已在较新版本中得到纠正。
在两个版本中,INNER JOIN
查询均不返回任何行。
但是,如果您直接添加到它:
ORDER BY L.rowid
然后正常工作。
请参见demo for 3.8和demo for 3.26。
现在,子查询的rowid
是什么?
事实是它作为一列存在,但它是null
。
请参见demo for 3.8和demo for 3.26。