Почему LEFT JOIN работает в этом запросе с rowid, а INNER JOIN - нет? - PullRequest
0 голосов
/ 13 мая 2019

У меня есть простая таблица OriginalValidLeaders с одним столбцом LeaderType.

Leader A
Leader B
Leader C

Теперь я хочу случайным образом назначить их друг другу, например (это нормально, если некоторые из них не меняются местами):

Leader A | Leader C
Leader B | Leader A
Leader C | Leader B

В этом вопросе решение состоит в том, чтобы использовать 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 Ответ

1 голос
/ 13 мая 2019

Вы должны использовать старую версию SQLite .
Это правда, что один и тот же запрос (с LEFT JOIN) возвращает разные результаты для разных версий:
-------- SQLite 3.8

a        | b       
-------- | -------
Leader A | Leader B
Leader B | Leader C
Leader C | Leader A

См. Демоверсию .

------- SQLite 3.26

| a        | b   |
| -------- | --- |
| Leader A |     |
| Leader B |     |
| Leader C |     |

См. Демоверсию .

Я не знаю, была ли это ошибка и теперь исправлена ​​в более новых версиях.
В обеих версиях запрос INNER JOIN не возвращает никаких строк.
Но , если вы просто добавите к нему:

ORDER BY L.rowid

тогда все работает нормально.
См. Демонстрацию для 3,8 и демонстрацию для 3,26 .

Теперь, что такое rowid подзапроса?
Правда в том, что существует как столбец , но это null.
См. Демонстрацию для 3,8 и демонстрацию для 3,26 .

...