【问题标题】:SQL query doesn't work in my JOIN exercisesSQL 查询在我的 JOIN 练习中不起作用
【发布时间】:2019-04-17 13:50:24
【问题描述】:

我正在使用SQL查询,但查询结果是12行,需要3行;我想不通。

查询无效:

SELECT g.*
    ,c.TxtFobFiyati
    ,C.TxtTalepETeslimTarihi
    ,c.TslParaBirimi
    ,c.TxtFiyat
    ,C.TslDepoKodu
    ,c.TslOlcuBirimi AS 'Olcu'
    ,j.TxtAmbalajDara
    ,j.TxtPaletDara
    ,g.TxtAdet AS 'ambalajAdet'
    ,g.TxtPaletSayisi AS 'paletSayisi'
    ,j.TxtAmbalajAdi
    ,J.TxtAmbalajNetKG
    ,j.TxtBoxGrossWeight
    ,C.TxtAciklama AS 'KalemAciklama'
    ,G.TxtAciklama AS 'KalemAciklama2'
    ,g.TxtPaletUstu AS 'PaletUstu'
    ,g.TxtPaletSayisi AS 'PaletSayisi'
    ,c.TxtUrunAdiEng AS 'UrunAdi_Ingilizce'
    ,C.TxtFobFiyati AS 'FobFiyati'
    ,j.TslPaletTipi AS 'PaletTipi'
    ,j.TxtPaletDara AS 'PaletDara'
FROM E_KT_SAS_Form A
LEFT JOIN E_KT_SAS_Form_DtyUrunler2 B
    ON A.ID = B.FORMID
LEFT JOIN E_KT_SAS_FrmSipUrunEkle C
    ON B.DOCUMENTID = C.ID
LEFT JOIN E_KT_SAS_Form_DtyTeyitEdilen2 D
    ON A.ID = D.FORMID
LEFT JOIN E_KT_SAS_FrmUretimTarihiEkle E
    ON D.DOCUMENTID = E.ID
        AND E.TslUrun = C.TslUrunKodu
LEFT JOIN E_KT_SAS_Form_DtySevkiyatlar F
    ON A.ID = F.FORMID
LEFT JOIN E_KT_SAS_FrmSevkiyatEkle G
    ON F.DOCUMENTID = G.ID
LEFT JOIN E_KT_SAS_FrmSipUrunEkle_DtyAmbalajlama H
    ON C.ID = H.FORMID
LEFT JOIN E_KT_SAS_FrmUrunAmbalajlama J
    ON H.DOCUMENTID = J.ID
WHERE E.TslOnay_TEXT = 'Evet'
    AND C.TslUrunKodu = G.TslUrun
    AND A.ID = 11682

无效的结果

正确的结果表

【问题讨论】:

  • 我将从格式化该查询开始。这是一个没有人愿意解开的热混乱。您还应该使用有助于增加清晰度的别名而不是随机字母。 sqlblog.org/2009/10/08/…
  • 讨厌的方法是执行 SELECT DISTINCT,更好的方法是找出为什么你有重复的行,我怀疑你的一个或多个连接不正确
  • 你的 where 谓词正在将你的一些连接变成内部连接。也许这些谓词应该移到连接中?
  • 发布数据图像不是很有帮助。 Why?此外,发布一些细节以允许其他人提供帮助会使这更好。 Here 是一个很好的起点。
  • 您可以随时编辑您的帖子

标签: sql sql-server join left-join inner-join


【解决方案1】:

Step1) 从驱动程序表开始计数,即别名为“A”的表。如果得到 3,请检查计数。继续。 对每个新加入重复第 1 步,看看你的计数在哪里增加到 12。那是你的麻烦加入。如果可能,将其注释掉并继续连接。如果您无法进行连续连接,请找到最佳解决方案,将计数降至 3。

如果你确定你的 where 子句很棒;否则也开始没有它。如果计数大于 3。将其弹回。

  select count(1) 
    FROM E_KT_SAS_Form A
    LEFT JOIN E_KT_SAS_Form_DtyUrunler2 B ON A.ID = B.FORMID
    LEFT JOIN E_KT_SAS_FrmSipUrunEkle C  ON B.DOCUMENTID = C.ID
    LEFT JOIN E_KT_SAS_Form_DtyTeyitEdilen2 D ON A.ID = D.FORMID
    LEFT JOIN E_KT_SAS_FrmUretimTarihiEkle E ON D.DOCUMENTID = E.ID
            AND E.TslUrun = C.TslUrunKodu 
    LEFT JOIN E_KT_SAS_Form_DtySevkiyatlar F ON A.ID = F.FORMID
    LEFT JOIN E_KT_SAS_FrmSevkiyatEkle G ON F.DOCUMENTID = G.ID
    LEFT JOIN E_KT_SAS_FrmSipUrunEkle_DtyAmbalajlama H ON C.ID = H.FORMID
    LEFT JOIN E_KT_SAS_FrmUrunAmbalajlama J ON H.DOCUMENTID = J.ID
    WHERE E.TslOnay_TEXT = 'Evet' AND C.TslUrunKodu = G.TslUrun AND A.ID = 11682

【讨论】:

  • 嗨。如果一个问题给出了一个包含 8 个左连接序列的查询,可以肯定地说它应该被否决并关闭投票,因为缺少 minimal reproducible example,没有回答。此外,这并不能回答问题,它是关于调试的教程(无论如何都应该在研究和娱乐编写问题之前)。此外,没有特别的理由期望在应用连接时计数应该保持低水平,因此它的方法是有缺陷的。
  • 显然其中一张表具有一对多的关系,这导致返回的行数激增。所有提出问题的人都在上面。因为如果把列留在里面,现在就有来自所有 8 个不同表的列;然后必须将每一个注释掉。我在知道用户没有提供样本数据的情况下给出了这个答案。它是提供给用户的路径;如果他/她不想接受它并以另一种方式找到答案,对他们来说更有力量。 ;)
猜你喜欢
  • 1970-01-01
  • 2012-09-26
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2020-04-03
  • 2014-10-19
  • 2013-09-10
相关资源
最近更新 更多