2016-06-08 2 views
1

Я имею вопрос понимания внутренней и оставили присоединитьсяПроблема понимания внутреннего соединения или влево присоединиться

Я имею ниже запрос в outsystems

SELECT {CLD}.[Id], {CLD}.[Name], {CLD}.[Comments] 
     , {CLD}.[LastUpdateOn],min({Project}.[Number]) 
     ,count({Project}.[Number]) 
FROM {CLD} 
    INNER JOIN {Project} ON {Project}.[Id] = {CLDProjects}.[ProjectId] 
    INNER JOIN {CLDProjects} ON {CLD}.[Id] = {CLDProjects}.[CLDId] 
WHERE 
    (
    @IsJAXPM =1 
    or EXISTS (SELECT 1 
      FROM {CLDParticipant} 
      WHERE {CLDParticipant}.[CLDId] = {CLD}.[Id] 
       AND {CLDParticipant}.[UserId] = @UserId) 
    or EXISTS (SELECT 1 
       FROM {ProjectParticipantWidget} 
        INNER JOIN {ProjectParticipant} ON {ProjectParticipantWidget}.[ProjectParticipantId] = {ProjectParticipant}.[Id] 
       WHERE {ProjectParticipant}.[ProjectId] = {Project}.[Id] 
        AND {ProjectParticipant}.[UserId] = @UserId) 
    ) 
GROUP BY {CLD}.[Id], {CLD}.[Name], {CLD}.[Comments], {CLD}.[LastUpdateOn] 

Выпуск Выбрать вытягивает все элементы CLD без уважения к проекту, я пытаюсь выбрать CLD, чей Project id = Project.Id. Я попробовал и стыки, но держать потянув все значения Ниже, как структура выглядит enter image description here

+0

Ваши условия соединения выглядят немного скремблированными, я даже не знал, что вы можете ссылаться на таблицы из последних объединений. (... и что с помощью '{' и '}'?) – Uueerdo

+1

Вы можете ссылаться на таблицы из более поздних объединений (потому что SQL смешивает объединения вместе для оптимизации), но я согласен, что это очень трудно читать так. CLDPпроекты должны быть обязательно перед проектом для удобочитаемости. Что касается {}, они позволяют платформе OutSystems расширяться в имена виртуальных таблиц, а именно фактическое имя физической таблицы в базе данных. –

+0

Те, кого боги уничтожат, сначала используют инструменты для разработки с конкретными «усовершенствованиями» для вендора ... –

ответ

2

Пожалуйста, попробуйте следующее: Во-первых получить CLDProjects соответствие с проектом, то получите CLD от соответствующих записей.

FROM {CLD} INNER JOIN (
    {CLDProjects} INNER JOIN {Project} ON {Project}.[Id] = {CLDProjects}.[ProjectId] 
) ON {CLD}.[Id] = {CLDProjects}.[CLDId] 
+0

Smozgur, я пробовал вышеупомянутое объединение, но все равно его тянул все – trx

+0

Тогда я попытался бы удалить часть WHERE, чтобы проверить, что он возвращается. После INNER JOIN выше это не имеет значения, однако я только что заметил ORs в вашем ГДЕ. Убедитесь, что WHERE не вызывает этого. Странно, выше INNER JOIN гарантирует, что набор записей источников содержит CLD, соответствующие CLDProjects, которые содержат только соответствующие проекты. – smozgur

1

Возможно, вам не хватает внутреннего соединения с CLDProjects в подзапросе ProjectParticipant. Добавить

INNER JOIN {CLDProjects} ON {ProjectParticipant}.[ProjectId] = {CLDProjects}.[ProjectId]) 

на второй EXISTS условия соединения, в противном случае это будет второй результат будет соответствовать существует для каждого проекта пользователь находится, не обращая внимания на другие условия более CLDProjects. Попробуйте следующее:

SELECT {CLD}.[Id], {CLD}.[Name], {CLD}.[Comments] 
     , {CLD}.[LastUpdateOn],min({Project}.[Number]) 
     ,count({Project}.[Number]) 
FROM {CLD} 
    INNER JOIN {Project} ON {Project}.[Id] = {CLDProjects}.[ProjectId] 
    INNER JOIN {CLDProjects} ON {CLD}.[Id] = {CLDProjects}.[CLDId] 
WHERE 
    (
    @IsJAXPM =1 
    or EXISTS (SELECT 1 
      FROM {CLDParticipant} 
      WHERE {CLDParticipant}.[CLDId] = {CLD}.[Id] 
       AND {CLDParticipant}.[UserId] = @UserId) 
    or EXISTS (SELECT 1 
       FROM {ProjectParticipantWidget} 
        INNER JOIN {ProjectParticipant} ON {ProjectParticipantWidget}.[ProjectParticipantId] = {ProjectParticipant}.[Id] 

        INNER JOIN {CLDProjects} ON {ProjectParticipant}.[ProjectId] = {CLDProjects}.[ProjectId] 

       WHERE {ProjectParticipant}.[ProjectId] = {Project}.[Id] 
        AND {ProjectParticipant}.[UserId] = @UserId) 
    ) 
GROUP BY {CLD}.[Id], {CLD}.[Name], {CLD}.[Comments], {CLD}.[LastUpdateOn] 

Также .. убедитесь, что вы не передаете @IsJAXPM как 1 ... в противном случае она определенно вернет все записи. Сообщите нам, если это работает. В противном случае расширьте диаграмму, чтобы отобразить таблицы ProjectParticipant и ProjectParticipantWidget.

0

Я думаю, вам просто нужно изменить порядок соединения, я попытался воспроизвести ваш случай (с неправильным присоединяется порядок), но он дает мне ошибку, когда тест на запрос, enter image description here

enter image description here

но если вы измените порядок соединений, он работает. обратите внимание, что я использую OutSystems 10

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