我是 SQL 的初学者,我有一个 sql 查询,它返回我需要的表信息,该表ARTICLE_MODE
:
GA_CODEARTICLE | C1 | C2 | C3 | GA_LIBELLE | C5 | C6 | GA_LIBREART3 | GA_LIBREART5 |
---|---|---|---|---|---|---|---|---|
BUTSS5-RC | 冲浪硬件 | —— | 潜水服 | 日封面 | 2021年 | 男女通用的 | 冲浪 | 特种作战部队 |
我需要检索有关第二个表的列的信息。MZS_DPAETAST
表的列MTMPTVGEN
。
在这两个表中,两列包含一些相同的信息:
表中的GA_CODEARTICLE
列ARTICLE_MODE
。
MZS_ARTICLE
表的列MTMPTVGEN
。
GA_CODEARTICLE | MZS_ARTICLE |
---|---|
BUTSS5-RC | BUTSS5-RC |
BUTS85-RC | BUTS85-RC |
BUTS75-RC | VMA045-VC |
我尝试执行此查询以检索MZS_DPAETAST
具有公共值GA_CODEARTICLE
和的列的值MZS_ARTICLE
,它返回许多结果:
select MZS_DPAETAST from MTMPTVGEN LEFT OUTER JOIN ARTICLE_MODE on MZS_ARTICLE=GA_CODEARTICLE
但是如何将它插入到我的初始查询中呢?谢谢你的帮助。
SELECT GA_CODEARTICLE, CC1.CC_LIBELLE AS C1,
YX2.YX_LIBELLE AS C2,
YX3.YX_LIBELLE AS C3,
GA_LIBELLE,
CC4.CC_LIBELLE AS C5,
CC5.CC_LIBELLE AS C6,
CC6.CC_LIBELLE AS C15,
GA_LIBREART3,
GA_LIBREART5
FROM ARTICLE_MODE
LEFT OUTER JOIN PGI_LOOKUP(GCFAMILLENIV1) CC1 ON GA_FAMILLENIV1=CC1.CC_CODE
AND CC1.CC_TYPE="FN1"
LEFT OUTER JOIN PGI_LOOKUP(GCLIBREART1) YX2 ON GA_LIBREART1=YX2.YX_CODE
AND YX2.YX_TYPE="LA1"
LEFT OUTER JOIN PGI_LOOKUP(GCLIBREART2) YX3 ON GA_LIBREART2=YX3.YX_CODE
AND YX3.YX_TYPE="LA2"
LEFT OUTER JOIN PGI_LOOKUP(GCCOLLECTION) CC4 ON GA_COLLECTION=CC4.CC_CODE
AND CC4.CC_TYPE="GCO"
LEFT OUTER JOIN PGI_LOOKUP(GCFAMILLENIV2) CC5 ON GA_FAMILLENIV2=CC5.CC_CODE
AND CC5.CC_TYPE="FN2"
LEFT OUTER JOIN PGI_LOOKUP(GCFAMILLENIV5) CC6 ON GA2_FAMILLENIV5=CC6.CC_CODE
AND CC6.CC_TYPE="FN5"
WHERE (GA_EMBALLAGE<>"X"
AND (GA_TYPEARTICLE NOT IN ("PRE","FI","FRA","UL","PAC"))
AND ((GA_STATUTART="GEN")))
ORDER BY GA_DATEMODIF DESC
很难理解您遇到的问题。您正在展示您知道如何加入article_mode
和mtmptvgen
。您有一个包含article_mode
. 那么是什么阻止你加入mtmptvgen
那里呢?
您的查询有许多外部联接。我不知道这些是否真的有必要。我现在也没有mtmptvgen
。我正在展示一个外连接,但是如果这足够了,您可以将其设为内连接。
SELECT
am.ga_codearticle,
cc1.cc_libelle as c1,
yx2.yx_libelle as c2,
yx3.yx_libelle as c3,
am.ga_libelle,
cc4.cc_libelle as c5,
cc5.cc_libelle as c6,
cc6.cc_libelle as c15,
am.ga_libreart3,
am.ga_libreart5,
m.mzs_dpaetast
FROM article_mode am
LEFT OUTER JOIN pgi_lookup(gcfamilleniv1) cc1 ON am.ga_familleniv1 = cc1.cc_code AND cc1.cc_type = 'FN1'
LEFT OUTER JOIN pgi_lookup(gclibreart1) yx2 ON am.ga_libreart1 = yx2.yx_code AND yx2.yx_type = 'LA1'
LEFT OUTER JOIN pgi_lookup(gclibreart2) yx3 ON am.ga_libreart2 = yx3.yx_code AND yx3.yx_type = 'LA2'
LEFT OUTER JOIN pgi_lookup(gccollection) cc4 ON am.ga_collection = cc4.cc_code AND cc4.cc_type = 'GCO'
LEFT OUTER JOIN pgi_lookup(gcfamilleniv2) cc5 ON am.ga_familleniv2 = cc5.cc_code AND cc5.cc_type = 'FN2'
LEFT OUTER JOIN pgi_lookup(gcfamilleniv5) cc6 ON am.ga2_familleniv5 = cc6.cc_code AND cc6.cc_type = 'FN5'
LEFT OUTER JOIN mtmptvgen m ON m.mzs_article = am.ga_codearticle
WHERE am.ga_emballage <> 'X'
AND am.ga_typearticle NOT IN ('PRE', 'FI', 'FRA', 'UL', 'PAC')
AND am.ga_statutart = 'GEN'
ORDER BY am.ga_datemodif DESC;
(我已经添加缺少的列预选赛和单引号替换了不恰当的双引号,这些都应该是字符串常量,不列名,对吧?我也觉得它使查询难读的时候一切都以大写字母和运算符、列名和文字之间没有空格。)
你说每个mzs_dpaetast
值只有一个article_mode
,但是数据模型不合适并且在每个相关mtmptvgen
行中冗余存储它。为了解决这个问题,您只需要mtmptvgen
每article_mode
行选择一行。一种方法是加入查询而不是表:
LEFT OUTER JOIN
(
SELECT mzs_article, MAX(mzs_dpaetast) AS mzs_dpaetast
FROM mtmptvgen
GROUP BY mzs_article
) m ON m.mzs_article = am.ga_codearticle
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句