如何在包含其他几个表的 sql 查询中对表进行连接?

埃里克27

我是 SQL 的初学者,我有一个 sql 查询,它返回我需要的表信息,该表ARTICLE_MODE

GA_CODEARTICLE C1 C2 C3 GA_LIBELLE C5 C6 GA_LIBREART3 GA_LIBREART5
BUTSS5-RC 冲浪硬件 —— 潜水服 日封面 2021年 男女通用的 冲浪 特种作战部队

我需要检索有关第二个表的列的信息。MZS_DPAETAST的列MTMPTVGEN

在这两个表中,两列包含一些相同的信息:

表中GA_CODEARTICLEARTICLE_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_modemtmptvgen您有一个包含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行中冗余存储它为了解决这个问题,您只需要mtmptvgenarticle_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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Sql中对表进行分组

如何在不对表名和字段进行硬编码的情况下在Hibernate中编写本机SQL查询?

动态查询:如何在 SQL-Server 中定义表名或其他字符串

对表中的所有记录进行 sql 限制查询

SQL如何对表中的不同值进行分组?

如何使用pl sql块对表中的数据进行排序

如何在具有宽表的SQL查询中将一列与其他所有列进行比较?

如何在触发器的帮助下更新其他sql表中的行

如何在提交之前预先检查其他sql表中的表单值-symfony

Python SQL如何在其他表中查找不匹配项?

如何使用SQL查询在父级和子级之间对表记录进行排序

如何在Java中连接SQL查询?

如何在 SQL 中编写连接查询

SQL Server:如何在对表的每个查询中添加提示?

如何在Mysql / Sql中按时间列对表进行排序?

如何在 SQL/Active Record 中进行包含和排除连接查询?

如何根据其他表中的值从表中执行 SQL 查询?

如何对一个SQL查询的结果与其他表的数据进行排序

修改SQL查询以包含其他参数

SQL Select语句可以对表中的行进行计数,而不是主查询中的行

如何从Oracle的SQL中的其他表更新

如何从 SQL Server 中的其他表传递值

连接表中的SQL查询问题

如何在 Python 或 SQL 中使用连接或任何其他操作合并两个数据集/表

SQL查询以显示包含两个表且其他表中不存在的数据行

使用SQL子查询对表中的行数进行计数,并根据结果通过/失败Java测试

如何加入 SQL Server 中的多个列并在一个表中包含其他表中不存在的列?

SQL - 在子查询中获取对表的引用

SQL将列添加到包含与查询匹配的其他表中的行总和的结果中