为什么LEFT JOIN在具有rowid的查询中起作用,而INNER JOIN却不起作用?

时间:2019-05-13 15:38:25

标签: sqlite join random left-join inner-join

我有一个简单的表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');

1 个答案:

答案 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.8demo for 3.26

现在,子查询的rowid是什么?
事实是它作为一列存在,但它是null
请参见demo for 3.8demo for 3.26