SQLSERVER 数据库多表联查重复值问题

       之前在网上找了好就都没有找到我想要的,都说使用distinct 但是没有什么用,自己苦苦的搞了半个小时终于解决了,具体方法是子查询解决的。

一、什么是之查询

        在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。当获得一个查询的答案需要多个步骤的操作,首先必须创建一个查询来确定用户不知道但包含在数据库中的值,将一个查询块嵌套在另一个查询块的WHERE字句或HAVING短语的条件中查询块称为子查询或内层查询。上层的查询块曾为父查询或外层查询。子查询的结果作为输入传递回“父查询”或“外部查询”。父查询将这个值结合到计算中,以便确定最后的输出。

二、子查询语法

(SELECT [ALL I DISTINCT  ]<select item list>
FROM <tabie list >
[WHERE <search condition>]
[GROUP BY <group item list>
[HAYING <group by search condition>}})

语法规则:

   1、之查询的SELECT 查询必须用括号抱起来。

   2、不能包括COMPUTE 或 FOR BROWES 子句。

   3、如果同时指定TOP句子,则可能只包括 ORDER BY  之句。

   4、之查询最多可以嵌套32层。

   5、如何可以使用表达式的地方都可以使用子查询,只要它返回单个值。

   6、如果某个表出现子查询中而不出现外部查询中,那么该表中的列就无法包含在输出中。

三、子查询常用表达式

  (1)第一种语法

SELECT *FROM 表 WHERE [NOT] IN (子查询)

 (2)第二种语法

SELECT *FROM 表名 where 查询  [ANY | ALL] (子查询)

 (3)第三种语法

SELECT *FROM 表名 WHERE [NOT] EXISTS (子查询)

上面就是简单的子查询运用了,

四、我的运用

1、我在多表联查时,出现A连B连C连E的过程中B有重复值,但是B没有重复行 要关联C就查询重复行,所有我把A,B,C关联子查询就解决问题了,然后在关联B即可(就是以C为条件取出我想要的 A,B,C 的值)。

代码如下不谢:

declare @TEMT_SJ datetime
declare @TEMT_SJX datetime
select BM.FNUMBER as 组织编码 ,ZZ.FNAME as 采购组织,GYSB.FNUMBER AS 供应商编码, CDT.FAPPROVEDATE,
GY.FNAME as 供应商名称,CDT.FBILLNO as 采购订单据编号,wl .FNUMBER as 物料编码,
WDL.FNAME as 物料名称,WDL.FSPECIFICATION as 物料规格,
CM.FQTY as 数量 , isNULL( O.实收数量,0)as 实收数量 ,o.来源订单号,o.采购订单匹配机照,
 ISNULL(实收数量/CM.FQTY * 100,0) as 实际入库率
from  T_PUR_POORDERENTRY CM  LEFT JOIN
(SELECT sum( RKT.FREALQTY) as 实收数量,GL.FSID as 采购订单匹配机照,RKT.FPOORDERNO as 来源订单号,GL.fstablename as 采购入库单内码
FROM T_STK_INSTOCK RK 
LEFT JOIN T_STK_INSTOCKENTRY RKT ON RK.FID=RKT.FID
LEFT JOIN T_STK_INSTOCKENTRY_LK GL ON GL.FENTRYID=RKT.FENTRYID
where GL.fstablename='t_PUR_POOrderEntry'   GROUP BY GL.FSID ,RKT.FPOORDERNO,GL.fstablename) o on  CM.FENTRYID=o.采购订单匹配机照
LEFT JOIN T_PUR_POORDER CDT  ON  CDT.FID=CM.FID
LEFT JOIN T_BD_MATERIAL wl ON CM.FMATERIALID=wl.FMATERIALID
LEFT JOIN T_BD_MATERIAL_L WDL ON CM.FMATERIALID=WDL.FMATERIALID
LEFT JOIN T_BD_SUPPLIER_L GY ON CDT.FSUPPLIERID=GY.FSUPPLIERID
LEFT JOIN T_BD_SUPPLIER GYSB ON CDT.FSUPPLIERID=GYSB.FSUPPLIERID
LEFT JOIN T_ORG_ORGANIZATIONS_L ZZ ON CDT.FPURCHASEORGID= ZZ.FORGID
LEFT JOIN T_ORG_ORGANIZATIONS BM ON CDT.FPURCHASEORGID=BM.FORGID
where CDT.FBILLNO= 'A01CGDD/21-03-04/015627' and CDT.FAPPROVEDATE>=@TEMT_SJ and CDT.FAPPROVEDATE<=@TEMT_SJX

说明一下:

                  declare @TEMT_SJ datetime
                  declare @TEMT_SJX datetime

这两个是我第一的全局变量,其是做用与金蝶云星空 SQL开发计算入库率的,如果有用的直接放到云星空里即可。

注意这个最好写一个存储过程:

如下

CREATE PROCEDURE BOOK --存储过程名称
@TEMT_SJ datetime
@TEMT_SJX datetime
AS 

上面代码

GO

好了-》云星空BOS的配置我就不说了,金蝶里有好的教程

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

dujunwoaini

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值