Вы повторно используете один и тот же объект Statement
для выполнения двух запросов. Когда stmt
используется для выполнения второго запроса, объект ResultSet
, возвращенный предыдущим оператором, закрывается. Создайте два объекта для каждого запроса.
Пример:
Statement stmt = conn.createStatement();
Statement stmt1 = conn.createStatement();
...
ResultSet res = stmt.executeQuery(Query);
...
while(res.next()){
S_Code = res.getString("S_Code");
Query1 = "SELECT * From Subjects WHERE Prerequisite = '"+S_Code+"'";
res1 = stmt1.executeQuery(Query1); // use a separate statement
while(res1.next()){
DLM.addElement(res.getString("S_Code"));
}
}
Это объясняется в следующей цитате из Statement
API docs :
По умолчанию только один объект
blockquote>ResultSet
на объектStatement
может быть открыт одновременно. Поэтому, если чтение одного объектаResultSet
чередуется с чтением другого, каждый из них должен быть сгенерирован разными объектами Statement. Все методы выполнения в интерфейсеStatement
неявно закрывают текущийResultSet
объект статута, если существует открытый.Также настоятельно рекомендуется закрыть ресурсы JDBC в файле обратный порядок их размещения, т. е. вы должны закрыть
Statement
, затем закройтеConnection
, и вы должны сделать это в блокеfinally
:catch(SQLException e){ JOptionPane.showMessageDialog(null, e.toString()); } finally { if(res != null) { res.close(); } if(res1 != null) { res1.close(); } if(stmt != null) { stmt.close(); } if(stmt1 != null) { stmt1.close(); } if(conn != null) { conn.close(); } }
re, используя Java 7, вы можете использовать оператор try-with-resources для автоматического закрытия этих ресурсов (без явного вызова метода
close()
):// try-with-resources statement declaring two resources try(Connection conn = DriverManager.getConnection(url,username,password); Statement stmt = conn.createStatement()) { ... } catch(SQLException e){ JOptionPane.showMessageDialog(null, e.toString()); }
Попробуемые ресурсы будут не забудьте закрыть объект
Statement
, затемConnection
после их использования.
Вы можете сделать:
select id
from t
group by id
having sum(case when extract(day from due_dt + interval '1 day') = 1 then 1 else 0 end) = count(*);
Это использует стандартные функции ANSI / ISO для арифметики дат. Они, как правило, зависят от базы данных, но идея одинакова во всех базах данных - добавьте один день и посмотрите, равен ли день месяца для всех строк.
Идея довольно проста:
Я попытался написать пример (не тестировался). Вы не указываете, какая БД, поэтому я предполагаю, что cte (общее табличное выражение) доступно. Если не просто поставить cte в подзапрос. Точно так же я не уверен, что dateadd
и interval
работают одинаково во всех диалектах.
with addlastdayofmonth as (
select
id
-- adding a 'virtualcolumn', 1 if last day of month 0 otherwise
, if(month(dateadd(due_date, interval '1' day)) != month(due_date), 1 ,0) as onlastday
from
table
)
select
id
, count(*) - sum(onlastday) as alwayslastday
from
addlastdayofmonth
group by
id
having
-- if count(rows) == count(rows with last day) we have a winner
halwayslastday = 0
Если вы используете SQL Server 2012+, вы можете использовать функцию EOMONTH () для достижения этой цели:
SELECT DISTINCT ID FROM [table]
WHERE DUE_DT = EOMONTH(DUE_DT)
MySQL-Version (кредиты @Gordon Linoff)
SELECT
ID
FROM
<table>
GROUP BY
ID
HAVING
SUM(IF(day(DUE_DT + interval 1 Day) = 1, 1, 0)) = COUNT(ID);
Исходный ответ:
SELECT MAX(DUE_DT) FROM <table> WHERE ID = <the desired ID>
или если вы хотите все MAX ( DUE_DT) для каждого уникального идентификатора
SELECT ID, MAX(DATE) FROM <table> GROUP BY ID
last day of each month
фактический последний день или только самый высокий день из данных?
– Pilan
13 July 2018 в 19:29