我有以下查询
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
提供正确的诽谤,但我仍然希望能够对问题进行排序没有太多的手动调整。说实话,我讨厌陷入无法解决的问题。
答案 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中。运行两个查询以更好地了解您拥有的内容
LEFT OUTER JOIN PARTENAIRES ON (PARTENAIRES.IU_PART = Etablissements.IU_GREFFE)
LEFT OUTER JOIN PARTENAIRES ON (Etablissements.IU_GREFFE为空)
我打赌(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