#sql #sqlite #join
Вопрос:
У меня есть этот стол
таблица 1
---------------
nums |
---------------
1 |
2 |
8 |
32 |
11 |
31 |
28 |
17 |
38 |
14 |
--------------
тогда у меня есть этот стол
таблица 2
--------------------
DRAWNUMBER|n1|n2|n3|
--------------------
39494 |2 |23|34|
28288 |8 |12|11|
23000 |11|32|20|
90000 |14|28|38|
30000 |22|18|11|
10000 |32|39|18|
-------------------
с помощью этого запроса я получаю номера основного розыгрыша(сгруппированные)из табл. 2
SELECT (" "||n1||"-"||n2||"-"||n3 )NUMBERS FROM(SELECT n1,n2,n3, max(DRAWNUMBER) FROM table2)
Результаты:
----------
NUMBERS |
---------|
14-28-38 |
----------
Теперь мне нужно внести в таблицу 1 только те числа, которые указаны в таблице 2.
С помощью этого запроса я пытаюсь провести сравнение, но получаю все цифры из таблицы 2.
SELECT nums from table1 WHERE EXISTS(SELECT (" "||n1||"-"||n2||"-"||n3)FROM(SELECT n1,n2,n3, max(DRAWNUMBER) FROM table2))
Результаты:
---------------
nums |
---------------
1 |
2 |
8 |
32 |
11 |
31 |
28 |
17 |
38 |
14 |
--------------
Ожидаемый:
---------------
nums |
---------------
14 |
28 |
38 |
--------------
Если вместо этого я хочу извлечь числа из таблицы 1, которых НЕТ в таблице 2, она просто возвращает пустые.
SELECT nums from table1 WHERE NOT EXISTS(SELECT (" "||n1||"-"||n2||"-"||n3)FROM(SELECT n1,n2,n3, max(DRAWNUMBER) FROM table2))
Результаты:
---------------
nums |
---------------
|
--------------
Я не знаю, что не так с запросом. Я уже изменил EXISTS на=, а также использовал оператор<>, но он не соответствует моим ожиданиям. Заранее спасибо.-
Ответ №1:
Вы можете присоединиться table1
к запросу:
SELECT n1, n2, n3, MAX(DRAWNUMBER) FROM table2
это возвращает номера вашего основного розыгрыша:
SELECT t1.*
FROM table1 t1
INNER JOIN (SELECT n1, n2, n3, MAX(DRAWNUMBER) FROM table2) t2
ON t1.nums IN (t2.n1, t2.n2, t2.n3)
ORDER BY t1.nums;
Или измените IN
NOT IN
значение на, чтобы получить номера, table1
которые не возвращаются запросом.
Смотрите демонстрацию.
Комментарии:
1. Любопытно узнать о SQLite (которым я в настоящее время не пользуюсь). Принимает ли он сочетание агрегированных и неагрегированных столбцов, как раньше принимал MySQL?
2. Это здорово! это работает, @forpas, Большое тебе спасибо. Просто я не понимаю, зачем ему нужно внутреннее соединение для работы. В документе sqlite об этом не упоминается. Что угодно.. Это работает!
3. @TheImpaler да, это задокументированное поведение: sqlite.org/lang_select.html найдите «голые столбцы».
4. Ты прав, @forpas, это действительно о тебе говорит. Но когда кто-то использует EXISTS или НЕ СУЩЕСТВУЕТ, он просто вызывает столбец другой таблицы без внутреннего соединения.. по крайней мере, это то, что я видел во многих примерах. Спасибо
5. @forpas я понял. Большое вам спасибо !