2015-11-30 5 views
2

Я делаю приложение Java с базой данных Postgres и следующая схема:запроса, чтобы найти проекты без лидера

enter image description here

сущностей employee, rol, project имеет некоторую информацию внутри, и участники объектных пусто. Я хочу показать в своем приложении таблицу всех проектов, в которой пока еще нет назначенного лидера. Я уверен, что это возможно с SQL-запросом, но я не уверен, как это сделать. Я пробовал этот вопрос:

SELECT p.projectnumber from participants pa, projecto p 
where p.projectnumber=pa.projectnumber and pa.leaderid IS NULL; 

Но никаких строк не возвращено. Это связано с тем, что объект-участник пуст, но я не могу заполнить этот объект только профайлами. Как вы думаете, я мог бы сделать это проще с запросом или любым другим предложением?

ответ

1

Я хочу, чтобы показать на моем приложении таблицу, которая показывает все проекты, не Руководитель назначен еще

Гадать, что лидеры означается, имеющие ненулевое значение в participants.leaderid:

SELECT projectnumber 
FROM projecto p 
WHERE NOT EXISTS (
    SELECT 1 
    FROM participants 
    WHERE projectnumber = p.projectnumber 
    AND leaderid IS NOT NULL 
    ); 

Вы можете решить с LEFT JOIN, а, но затем включить leaderid в условии соединения:

SELECT p.projectnumber 
FROM projecto p 
LEFT JOIN participants pa ON pa.projectnumber = p.projectnumber 
          AND pa.leaderid IS NOT NULL 
WHERE pa.projectnumber IS NULL; 

Проверка на leaderid в состоянии WHERE (послеLEFT JOIN) не может отличить ли столбец leaderid является NULL в базовой таблице или потому, что нет подключенной строки в participants. В этом конкретном запросе результат все равно будет правильным (ни один участник, ни один лидер). Но он будет возвращать одну строку для каждого участника, который не является лидером, и я ожидаю, что вы захотите перечислить каждый проект без лидера только один раз. Вы должны были бы объединиться, но для чего нужно присоединиться к нескольким не-лидерам?

Основа:

Это в стороне, ваша реляционная дизайн, кажется, не складывает. Что нужно для предотвращения нескольких лидеров для одного и того же проекта? Почему varchar(30) для большинства столбцов? Почему нет ограничений FK между participant и project? Почему projecto в запросе, но project в диаграмме ER? И т. Д.

+0

wow только то, что мне нужно, большое спасибо :) –

+0

хорошо проблема, которую я должен проектировать, говорит мне, что сотрудник может быть в одном или нескольких проектах, поэтому я думаю, что он может быть лидером многих проектов. я буду учитывать все ваши вопросы, но я могу только сказать, что начал изучать основы баз данных, поэтому я все еще новичок в этом вопросе. У меня еще есть длинный путь, чтобы узнать: D –

+0

@ DanielEstebanLadinoTorres: В одном проекте может быть много сотрудников (в качестве участников), один сотрудник может принять участие во многих проектах.Похоже на типичное отношение «многие ко многим». Ролевую игру можно считать дополнительным атрибутом (упрощенным). Инструкции здесь: http://stackoverflow.com/a/9790225/939860 –

1

Вы можете использовать LEFT JOIN при условии, проекты, которые не имеют записей в таблице Участники будут без лидера:

SELECT p.projectnumber 
FROM projecto p LEFT JOIN participants pa 
ON p.projectnumber=pa.projectnumber 
WHERE pa.leaderid IS NULL; 
+0

спасибо по-прежнему полезно для будущих ссылок –

Смежные вопросы