SQL Запрос с LEFT JOIN не может найти данные - PullRequest
0 голосов
/ 20 февраля 2020

Я работаю над своим C# проектом, и мне нужно получать данные из базы данных благодаря. sql процедурам.

Синтез:

Таблица ProprietesCourantes связана с таблицей Entite.

Таблица Archive связана с таблицей EntiteArchive

==> Я хотел бы сделать ссылку между ProprietesCourantes и Archive благодаря полю Libellé

Таблица ProprietesCourantes

У меня есть несколько таблиц в моем случае:

SELECT TOP (1000) [IdEntite]
      ,[Libelle]
      ,[EstActif]
      , ...
      , ...
  FROM [Database].[dbo].[ProprietesCourantes]
  WHERE [Libelle] = 'DELTA SERVICE AUTO';

enter image description here

Таблица Entite

SELECT TOP (1000) [IdEntite]
      ,[TypeEntite]
      ,[CodeEntite]
      ,[TypeCodeEntite]
  FROM [Database].[dbo].[Entite]
  WHERE IdEntite = '165';

enter image description here

Таблица Archive

SELECT TOP (1000) [IdArchive]
      ,[IdEntite]
      ,[NoteFinale]
      ,[EstValide]
  FROM [Database].[dbo].[Archive]
  WHERE IdEntite = '33' and EstValide = '1';

enter image description here

Таблица EntiteArchive

SELECT TOP (1000) [IdEntite]
      ,[TypeEntite]
      ,[CodeEntite]
      ,[Libelle]
      ,...
  FROM [Database].[dbo].[EntiteArchive]

enter image description here

MY SQL ЗАПРОС:

SELECT
            ProprietesCourantes.IdEntite                                                                    as IdEntite, 
            ProprietesCourantes.Libelle                                                                     as RaisonSociale,
            Entite.CodeEntite                                                                               as IdCMCIC,
            ProprietesCourantes.NomParent                                                                   as NomGN,
            Archive.NoteFinale                                                                              as Cotation,
            Archive.DateValiditeQuestionnaireDeSoutien                                                      as DateValiditeQuestionnaireDeSoutien,
            ProprietesCourantes.CodePays                                                                    as Pays,
            ProprietesCourantes.EstActif                                                                    as Statut,
            CAST(CASE WHEN Entite.CodeEntite = ProprietesCourantes.IdSocMere THEN 1 ELSE 0 END AS BIT)      as EstMaisonMere,
            ProprietesCourantes.IdCMCICParent                                                               as IdCMCICParent,
            ProprietesCourantesGN.CodeAlgo                                                                  as CodeAlgoParent

    FROM ProprietesCourantes

    LEFT JOIN Archive   ON (Archive.IdEntite  = ProprietesCourantes.IdEntite and Archive.EstValide=1)
    LEFT JOIN Entite ON Entite.IdEntite = ProprietesCourantes.IdEntite
    LEFT JOIN Entite as EntiteGN ON EntiteGN.CodeEntite = ProprietesCourantes.IdCMCICParent
    LEFT JOIN ProprietesCourantes as ProprietesCourantesGN ON ProprietesCourantesGN.IdEntite = EntiteGN.IdEntite

    WHERE Entite.TypeEntite = 1 
        AND   (ProprietesCourantes.Libelle LIKE '%'+'DELTA SERVICE'+'%' )

enter image description here

Как видите, Cotation и DateValiditeQuestionnaireDeSoutien имеют значение NULL, поскольку LEFT JOIN Archive ON (Archive.IdEntite = ProprietesCourantes.IdEntite не может работать (другой IDEntite).

Я пытался заменить на это, но это не работает, любая идея?

LEFT JOIN Archive   ON ((select EntiteArchive.Libelle from EntiteArchive LEFT JOIN Archive ON (EntiteArchive.IdEntite = Archive.IdEntite)) = ProprietesCourantes.Libelle and Archive.EstValide=1)

Ответы [ 3 ]

2 голосов
/ 20 февраля 2020

Просто переместите условие в let join ed таблице Entite в on часть объединения. В противном случае это становится обязательным условием и отфильтровывает записи, для которых нет совпадений в Entite.

SELECT
            ProprietesCourantes.IdEntite                                                                    as IdEntite, 
            ProprietesCourantes.Libelle                                                                     as RaisonSociale,
            Entite.CodeEntite                                                                               as IdCMCIC,
            ProprietesCourantes.NomParent                                                                   as NomGN,
            Archive.NoteFinale                                                                              as Cotation,
            Archive.DateValiditeQuestionnaireDeSoutien                                                      as DateValiditeQuestionnaireDeSoutien,
            ProprietesCourantes.CodePays                                                                    as Pays,
            ProprietesCourantes.EstActif                                                                    as Statut,
            CAST(CASE WHEN Entite.CodeEntite = ProprietesCourantes.IdSocMere THEN 1 ELSE 0 END AS BIT)      as EstMaisonMere,
            ProprietesCourantes.IdCMCICParent                                                               as IdCMCICParent,
            ProprietesCourantesGN.CodeAlgo                                                                  as CodeAlgoParent    
    FROM ProprietesCourantes    
    LEFT JOIN Archive
        ON  Archive.IdEntite  = ProprietesCourantes.IdEntite 
        AND Archive.EstValide=1)
    LEFT JOIN Entite 
        ON  Entite.IdEntite = ProprietesCourantes.IdEntite 
        AND Entite.TypeEntite = 1 
    LEFT JOIN Entite as EntiteGN 
        ON  EntiteGN.CodeEntite = ProprietesCourantes.IdCMCICParent
    LEFT JOIN ProprietesCourantes as ProprietesCourantesGN 
        ON  ProprietesCourantesGN.IdEntite = EntiteGN.IdEntite
    WHERE ProprietesCourantes.Libelle LIKE '%'+'DELTA SERVICE'+'%' 
1 голос
/ 20 февраля 2020

Можно ли использовать CodeEntite как объединение?

JOIN [EntiteArchive] ON [Entite].[CodeEntite] =  [EntiteArchive].[CodeEntite] 
JOIN [Archive] ON [EntiteArchive].[IdEntite]  = [Archive].[IdEntite] 
1 голос
/ 20 февраля 2020

Нелегко увидеть, как обстоят дела с вашими таблицами ... возможно ли, что в таблице архива нет строк для IdEntite = '165'? Два ключа одинакового формата? Вы показываете вывод для IdEntite = '165', но 4 примера таблицы предназначены для 2 разных IdEntite. Можете ли вы предоставить больше информации?

Отредактировано: Насколько я понимаю, вы хотите присоединиться к полю Libelle как ProprietesCourantes, так и Archive, но ваше объединение основано на IdEntite?

Если это так, используйте объединение промежуточных таблиц `` `...

Archive.NoteFinale                                   as Cotation,
Archive.DateValiditeQuestionnaireDeSoutien           as DateValiditeQuestionnaireDeSoutien,
...
LEFT JOIN EntiteArchive ON (EntiteArchive.Libelle = ProprietesCourantes.Libelle )
LEFT JOIN Archive ON (EntiteArchive.IdEntite = Archive.IdEntite)
...
```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...