RE:Base de datos enrrevesada
Lo que posteé era el SQL para realizar esa consulta, con tu aclaración me parece que esta bien.
SQL es el lenguaje estandar para los sistemas gestores de bases de datos, si lo quieres en Java y reutilizando el codigo que te he dado, tendras que usar JDBC para establecer una conexion a la fuente de datos, luego crear un objeto conexion, uno statement y luego correr el codigo que te facilité mas temprano, eso te devolverá un recordset con los datos que cumplen la especificación, mucho mas rapido y sencillo que cualquier implementacion en capa de negocios (osea, hecha en Java).
Si definitivamente tienes que comparar cada conjunto y filtrar a nivel de aplicacion (esto ya no se hace, porque el motor de base de datos es increiblemente eficiente haciendo esto, pero bueno, quiza lo piden con fines didacticos, como lo hicieron conmigo en su momento.....) tienes igual que utilizar JDBC para conectarte a la fuente de datos, obtener los datos de las dos tablas, hacer la union de conjuntos a pie, filtrar los datos (puntosrestantes < 4) y luego separar los valores que quieres mostrar en un arraylist para su despliegue.
Por motivos de tiempo y espacio, no comento mas que los pasos que debe seguir el método para llevar a cabo la tarea, el metodo correrá en dos segundos para una tabla de aproximadamente 100 registros, tablas mayores demorarán mas por que son mas registros que no encesariamente estan desordenados, si quieres mas velocidad en este proceso, ocuparías implementar sistemas de indexacion en memoria usando tablas de hash y sub listas