Ошибка сравнения и извлечения записей в SQLite

#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 я понял. Большое вам спасибо !