внутренний запрос без FROM - PullRequest
       2

внутренний запрос без FROM

0 голосов
/ 29 октября 2018

Я сделал ошибку при написании запроса, я написал подзапрос без предложения FROM:

select * from foo where id in (select id where type 'mm')

Я потерял полдня, чтобы найти ошибку, потому что она сработала!

Я проверил документацию, но не нашел никакой информации, почему ...

Это интереснее:

select * from abc a
inner join abc b on b.id = a.id
where a.id in (select id from (select a.id, row_number () over () lp where b.name = 'abc') x where lp = 1);

http://sqlfiddle.com/#!15/4bb29/12

Может кто-нибудь объяснить, как это работает?

1 Ответ

0 голосов
/ 30 октября 2018

Ваш первый запрос, безусловно, не будет работать как есть.

Чтобы понять ваш второй запрос, имейте в виду, что

  1. A SELECT без предложения FROM похоже на предложение FROM с таблицей, в которой нет столбца, но есть одна строка.

  2. Вы можете ссылаться на столбцы из внешнего запроса в подзапросе.

Вот попытка объяснить ваш запрос:

SELECT * FROM abc a
/* ok, now we have a table with alias "a" */
INNER JOIN abc b ON b.id = a.id
/* now we also have a table with alias "b" */
WHERE a.id IN
   (SELECT id
    FROM (SELECT a.id,
                 /* this will count the one "artificial" row */
                 row_number() OVER () lp
          /* Here you reference the table with alias "b" above.
             This is constant as far as the subquery is concerned,
             so if it is not TRUE, the subquery will return an
             empty result */
          WHERE b.name = 'abc') x
    /* this is always true, since there is only one line in
       the above subquery */ 
    WHERE lp = 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...