更改列名时,左连接返回不同的结果

时间:2016-05-10 14:20:56

标签: sql sql-server

我有以下查询

SELECT COUNT(DISTINCT ETABLISSEMENTS.IU_ETS) AS compte,ETABLISSEMENTS.IU_GREFFE
FROM ENTREPRISES 
LEFT OUTER JOIN ETABLISSEMENTS ON ETABLISSEMENTS.IU_ENTREPRISE = ENTREPRISES.IU_ENTREPRISE
LEFT OUTER JOIN dbo.BASES ON dbo.ETABLISSEMENTS.IU_BASE = dbo.BASES.IU_BASE 
LEFT OUTER JOIN dbo.ETATS ON dbo.ETABLISSEMENTS.IU_ETAT = dbo.ETATS.IU_ETAT
LEFT OUTER JOIN dbo.NAF ON dbo.ETABLISSEMENTS.IU_NAF_ECO = dbo.NAF.IU_NAF 
LEFT OUTER JOIN ADRESSES ON ETABLISSEMENTS.IU_ADR_PHY = ADRESSES.IU_ADR
LEFT OUTER JOIN PARTENAIRES ON 
(PARTENAIRES.IU_PART = Etablissements.IU_GREFFE OR Etablissements.IU_GREFFE IS NULL)
WHERE (dbo.ETABLISSEMENTS.SIREN IS NOT NULL) 
AND (dbo.ETABLISSEMENTS.SIREN <> '') 
AND (dbo.ENTREPRISES.FLG_HISTORISE <> '1') 
AND (dbo.ETABLISSEMENTS.NIC IS NOT NULL) 
AND (dbo.ETABLISSEMENTS.NIC <> '') 
AND (dbo.ETABLISSEMENTS.GESTDEL = '1') 
AND (dbo.BASES.CODE = 'J1') 
AND (dbo.ETATS.LIBEL = 'Actif') 
AND (dbo.NAF.NAF NOT LIKE '000%') 
AND (dbo.ENTREPRISES.GESTDEL = '1')
AND PARTENAIRES.IU_TYPE_PART = '3'
GROUP BY ETABLISSEMENTS.IU_GREFFE

目的是标记NULL并计算它们(见下文)。

  compte |  IU_GREFFE
  -------------------
  2      |  115
  1      |  126
  4875   |  26
  1      |  813
  21     |  2021
  36     |  5559
  6      |  149
  11661  |  27
  14904  |  130
  1      |  1298
  13402  |  25
  15790  |  NULL
  1      |  54
  11080  |  120
  9      |  423
  1      |  14

我想要一些更简洁的东西而不仅仅是一个带数字的计数,以获得如下的诽谤

  compte |  Greffes
  ------------------
  2      |  Stack
  1      |  Morris
  4875   |  Dembe
  1      |  Dallas
  21     |  Delhi
  36     |  Rohintra
  6      |  Zheng
  11661  |  Liliane
  14904  |  T-shirt
  1      |  Star
  13402  |  Yes
  15790  |  NULL
  1      |  Whatsapp
  11080  |  Enkai
  9      |  Algérie
  1      |  Hewah

我将查询更改为greffes的名称,我对

感兴趣
SELECT COUNT(DISTINCT ETABLISSEMENTS.IU_ETS) AS compte,PARTENAIRES.LIBEL AS Greffes 
-- changing the ETABLISSEMENTS.IU_GREFFE to PARTENAIRES.LIBEL
FROM ENTREPRISES 
LEFT OUTER JOIN ETABLISSEMENTS ON ETABLISSEMENTS.IU_ENTREPRISE = ENTREPRISES.IU_ENTREPRISE
LEFT OUTER JOIN dbo.BASES ON dbo.ETABLISSEMENTS.IU_BASE = dbo.BASES.IU_BASE 
LEFT OUTER JOIN dbo.ETATS ON dbo.ETABLISSEMENTS.IU_ETAT = dbo.ETATS.IU_ETAT
LEFT OUTER JOIN dbo.NAF ON dbo.ETABLISSEMENTS.IU_NAF_ECO = dbo.NAF.IU_NAF 
LEFT OUTER JOIN ADRESSES ON ETABLISSEMENTS.IU_ADR_PHY = ADRESSES.IU_ADR
LEFT OUTER JOIN PARTENAIRES 
ON (PARTENAIRES.IU_PART = Etablissements.IU_GREFFE OR Etablissements.IU_GREFFE IS NULL)
WHERE (dbo.ETABLISSEMENTS.SIREN IS NOT NULL) 
AND (dbo.ETABLISSEMENTS.SIREN <> '') 
AND (dbo.ENTREPRISES.FLG_HISTORISE <> '1') 
AND (dbo.ETABLISSEMENTS.NIC IS NOT NULL) 
AND (dbo.ETABLISSEMENTS.NIC <> '') 
AND (dbo.ETABLISSEMENTS.GESTDEL = '1') 
AND (dbo.BASES.CODE = 'J1') 
AND (dbo.ETATS.LIBEL = 'Actif') 
AND (dbo.NAF.NAF NOT LIKE '000%') 
AND (dbo.ENTREPRISES.GESTDEL = '1')
AND PARTENAIRES.IU_TYPE_PART = '3'
GROUP BY PARTENAIRES.LIBEL

我没有给出想要的结果,而是给出了下面的结果(只给你一小部分结果样本,因为有284行)

   compte    |Greffes
   -------------------
   15790     |Mooshi
   15790     |Bazoo
   15790     |NouYawk
   15790     |Matamata

考虑到这一点,问题很可能在于null部分,因为我在

上添加了这个额外的子句
LEFT OUTER JOIN PARTENAIRES ON 
(PARTENAIRES.IU_PART = Etablissements.IU_GREFFE OR Etablissements.IU_GREFFE IS NULL)

以下部分最具体

 OR Etablissements.IU_GREFFE IS NULL

观察结果,15790是空白部分。

由于我已经使用LEFT OUTER JOIN来检索NULL

,我不知道如何解决这个问题。

作为另一种变体,我尝试将第二个查询放入嵌套查询并使用partenaires表进行连接,但它给了我同样的问题。

任何见解都非常受欢迎

由于

更新:考虑到这一点,我可以使用case手动为iu_greffe提供正确的诽谤,但我仍然希望能够对问题进行排序没有太多的手动调整。说实话,我讨厌陷入无法解决的问题。

4 个答案:

答案 0 :(得分:1)

您使用 with 子句

with t as
(
SELECT COUNT(DISTINCT ETABLISSEMENTS.IU_ETS) AS compte,ETABLISSEMENTS.IU_GREFFE
FROM ENTREPRISES 
LEFT OUTER JOIN ETABLISSEMENTS ON ETABLISSEMENTS.IU_ENTREPRISE = ENTREPRISES.IU_ENTREPRISE
LEFT OUTER JOIN dbo.BASES ON dbo.ETABLISSEMENTS.IU_BASE = dbo.BASES.IU_BASE 
LEFT OUTER JOIN dbo.ETATS ON dbo.ETABLISSEMENTS.IU_ETAT = dbo.ETATS.IU_ETAT
LEFT OUTER JOIN dbo.NAF ON dbo.ETABLISSEMENTS.IU_NAF_ECO = dbo.NAF.IU_NAF 
LEFT OUTER JOIN ADRESSES ON ETABLISSEMENTS.IU_ADR_PHY = ADRESSES.IU_ADR
LEFT OUTER JOIN PARTENAIRES ON 
(PARTENAIRES.IU_PART = Etablissements.IU_GREFFE OR Etablissements.IU_GREFFE IS NULL)
WHERE (dbo.ETABLISSEMENTS.SIREN IS NOT NULL) 
AND (dbo.ETABLISSEMENTS.SIREN <> '') 
AND (dbo.ENTREPRISES.FLG_HISTORISE <> '1') 
AND (dbo.ETABLISSEMENTS.NIC IS NOT NULL) 
AND (dbo.ETABLISSEMENTS.NIC <> '') 
AND (dbo.ETABLISSEMENTS.GESTDEL = '1') 
AND (dbo.BASES.CODE = 'J1') 
AND (dbo.ETATS.LIBEL = 'Actif') 
AND (dbo.NAF.NAF NOT LIKE '000%') 
AND (dbo.ENTREPRISES.GESTDEL = '1')
AND PARTENAIRES.IU_TYPE_PART = '3'
GROUP BY ETABLISSEMENTS.IU_GREFFE
)
select t.compte, PARTENAIRES.LIBEL AS Greffes
from t
LEFT OUTER JOIN PARTENAIRES 
ON (PARTENAIRES.IU_PART = t.IU_GREFFE)
where PARTENAIRES.IU_TYPE_PART = '3'

答案 1 :(得分:1)

当你累了,你就搞砸了。这就是我之前所做的,我认为不起作用

SELECT t.compte, PARTENAIRES.LIBEL AS Greffes
FROM 
(
SELECT COUNT(DISTINCT ETABLISSEMENTS.IU_ETS) AS compte,ETABLISSEMENTS.IU_GREFFE
FROM ENTREPRISES 
LEFT OUTER JOIN ETABLISSEMENTS ON ETABLISSEMENTS.IU_ENTREPRISE = ENTREPRISES.IU_ENTREPRISE
LEFT OUTER JOIN dbo.BASES ON dbo.ETABLISSEMENTS.IU_BASE = dbo.BASES.IU_BASE 
LEFT OUTER JOIN dbo.ETATS ON dbo.ETABLISSEMENTS.IU_ETAT = dbo.ETATS.IU_ETAT
LEFT OUTER JOIN dbo.NAF ON dbo.ETABLISSEMENTS.IU_NAF_ECO = dbo.NAF.IU_NAF 
LEFT OUTER JOIN ADRESSES ON ETABLISSEMENTS.IU_ADR_PHY = ADRESSES.IU_ADR
LEFT OUTER JOIN PARTENAIRES ON 
(PARTENAIRES.IU_PART = Etablissements.IU_GREFFE OR Etablissements.IU_GREFFE IS NULL)
WHERE (dbo.ETABLISSEMENTS.SIREN IS NOT NULL) 
AND (dbo.ETABLISSEMENTS.SIREN <> '') 
AND (dbo.ENTREPRISES.FLG_HISTORISE <> '1') 
AND (dbo.ETABLISSEMENTS.NIC IS NOT NULL) 
AND (dbo.ETABLISSEMENTS.NIC <> '') 
AND (dbo.ETABLISSEMENTS.GESTDEL = '1') 
AND (dbo.BASES.CODE = 'J1') 
AND (dbo.ETATS.LIBEL = 'Actif') 
AND (dbo.NAF.NAF NOT LIKE '000%') 
AND (dbo.ENTREPRISES.GESTDEL = '1')
AND PARTENAIRES.IU_TYPE_PART = '3'
GROUP BY ETABLISSEMENTS.IU_GREFFE
) AS t
LEFT OUTER JOIN PARTENAIRES 
ON (PARTENAIRES.IU_PART = t.IU_GREFFE)

但它确实......

感谢@proggear的回答

答案 2 :(得分:1)

一个。如果您在联接表格中设置is null以外的条件,则left join没有意义。

  

LEFT OUTER JOIN PARTENAIRES ON(PARTENAIRES.IU_PART = Etablissements.IU_GREFFE或Etablissements.IU_GREFFE为空)
      ...
      AND PARTENAIRES.IU_TYPE_PART =&#39; 3&#39;

B中。运行两个查询以更好地了解您拥有的内容

  1.   

    LEFT OUTER JOIN PARTENAIRES ON   (PARTENAIRES.IU_PART = Etablissements.IU_GREFFE)

  2.   

    LEFT OUTER JOIN PARTENAIRES ON   (Etablissements.IU_GREFFE为空)

  3. 我打赌(1)将返回空结果,并且(2)15790在所有行中。

答案 3 :(得分:0)

尝试包装原始查询并更改外部查询的列名。

select compte, IU_GREFFE as Greffes from (
    SELECT COUNT(DISTINCT ETABLISSEMENTS.IU_ETS) AS compte,ETABLISSEMENTS.IU_GREFFE
    FROM ENTREPRISES 
    LEFT OUTER JOIN ETABLISSEMENTS ON ETABLISSEMENTS.IU_ENTREPRISE = ENTREPRISES.IU_ENTREPRISE
    LEFT OUTER JOIN dbo.BASES ON dbo.ETABLISSEMENTS.IU_BASE = dbo.BASES.IU_BASE 
    LEFT OUTER JOIN dbo.ETATS ON dbo.ETABLISSEMENTS.IU_ETAT = dbo.ETATS.IU_ETAT
    LEFT OUTER JOIN dbo.NAF ON dbo.ETABLISSEMENTS.IU_NAF_ECO = dbo.NAF.IU_NAF 
    LEFT OUTER JOIN ADRESSES ON ETABLISSEMENTS.IU_ADR_PHY = ADRESSES.IU_ADR
    LEFT OUTER JOIN PARTENAIRES ON 
    (PARTENAIRES.IU_PART = Etablissements.IU_GREFFE OR Etablissements.IU_GREFFE IS NULL)
    WHERE (dbo.ETABLISSEMENTS.SIREN IS NOT NULL) 
    AND (dbo.ETABLISSEMENTS.SIREN <> '') 
    AND (dbo.ENTREPRISES.FLG_HISTORISE <> '1') 
    AND (dbo.ETABLISSEMENTS.NIC IS NOT NULL) 
    AND (dbo.ETABLISSEMENTS.NIC <> '') 
    AND (dbo.ETABLISSEMENTS.GESTDEL = '1') 
    AND (dbo.BASES.CODE = 'J1') 
    AND (dbo.ETATS.LIBEL = 'Actif') 
    AND (dbo.NAF.NAF NOT LIKE '000%') 
    AND (dbo.ENTREPRISES.GESTDEL = '1')
    AND PARTENAIRES.IU_TYPE_PART = '3'
    GROUP BY ETABLISSEMENTS.IU_GREFFE
) as t