【发布时间】:2019-09-30 14:37:03
【问题描述】:
我有一个简单的表 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(这对我来说更有意义)但没有返回任何结果。
所以我的问题是:
- 为什么 LEFT JOIN 有效,而 INNER JOIN 无效?
- 这是否总是适用于所有情况?
测试架构/数据(归功于 forpas):
CREATE TABLE OriginalValidLeaders (LeaderType TEXT);
INSERT INTO OriginalValidLeaders (LeaderType) VALUES
('Leader A'), ('Leader B'), ('Leader C');
【问题讨论】:
-
您需要 sqlite 3.25 或更高版本的窗口函数,如
row_number(),顺便说一句。 -
除了左连接做一件事而内连接做另一件事之外,你还能期待什么答案?他们如何工作是一个常见问题。如果您不告诉我们您对每个案例的期望,我们怎么能告诉您您的信念和/或推理在哪里是错误或正确的?为什么说“它有效”?测试用例不能显示没有错误。 ORDER BY 在没有 TOP/LIMIT 的子查询中什么都不做。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS 了解 LEFT JOIN ON 返回什么: INNER JOIN ON rows UNION ALL 不匹配的左表行,由 NULL 扩展。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。
-
请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。) PS 表没有顺序。查询结果有(部分)顺序。
-
@philipxy 抱歉,感谢您提供的信息。我很少问关于数据库的问题,所以我还不熟悉。我已将其添加到问题中。下次我一定会记得的。
标签: sqlite join random left-join inner-join