SQL Server 实战 - 多种连接

ops/2024/12/1 4:07:08/

目录

背景

一、多种连接

1. 复合连接条件

2. 跨数据库连接

3. 隐连接

4. 自连接

5. 多表外连接

6. UNION ALL

二、一个对比例子


背景

本专栏文章以 SAP 实施顾问在实施项目中需要掌握的 sql 语句为偏向进行选题:

  • 用例:SAP B1 的数据库
  • 工具:SQL Server。

本文将详细讲解多种连接的复杂查询,并附带实战例题及代码解法。

前文:《SQL Server 查询设置 - LIKE/DISTINCT/HAVING/排序》

一、多种连接

1. 复合连接条件

查询时,通过 AND/OR 连接条件对查询进行筛选,很常见的基本用法,这里只展示语法:

SELECT [列名]
FROM [表名]
WHERE [条件1] AND/OR [条件2]

2. 跨数据库连接

有时候会需要使用其他账套的信息,在数据库层面看就是需要跨数据库连接表信息,比如同一家公司设立了多个账套,需要在账套间对账时。用 USE 即可调用其他数据库

数据库连接语法(这里的[]在替换内容时需要保留,详见下面例子):

USE [数据库1]
SELECT * FROM [数据库2].[dbo].[表名] --注意:这里的[]在替换内容时需要保留,详见下面例子

例:在使用数据库 DTWDATEBASE1 时,调用数据库 SBODemoCN 的业务伙伴主数据表单。

USE DTWDATEBASE1SELECT CardCode
FROM [SBODemoCN].[dbo].[OCRD]

3. 隐连接

就是不那么明显地连接,不想内连接和外连接,有直接和明显的 JOIN,LEFT JOIN,RIGHT JOIN

隐连接语法:

SELECT *
FROM [表1],[表2]
WHERE [条件1]

从效果上来说其实和内连接一样,内连接语法形式:

SELECT *
FROM [表1]
JOIN [表2] ON [条件1]

例子:

--隐连接
SELECT *
FROM OCRD T0,ORDR T1
WHERE T0.CardCode=T1.CardCode--内连接
SELECT *
FROM OCRD T0
JOIN ORDR T1
ON T0.CardCode=T1.CardCode

4. 自连接

顾名思义,即自我连接,和正常的表连接一样,分为自内连接(JOIN)和自外连接(LEFT/RIGHT JOIN)。一般的内连接和外连接都是连接两张不同的表,都是有时候需要连接相同的表。从语法上与一般连接无差别,仅是将同一张表引用两次,赋值为不同的表格。

:显示科目表的上级目录名称。

如下图,科目表的系统表单内容如下,有且仅有当前目录的编码和名称,以及上级目录的编码,此时要达到例题效果则需要使用自连接。

SELECT T0.AcctCode as '科目编号',T0.AcctName as '科目名称',T1.AcctName as '上级科目名称'
FROM OACT T0
LEFT JOIN OACT T1
ON T0.FatherNum = T1.AcctCode

查询结果如下:

5. 多表外连接

和正常的用 LEFT JOIN,RIGHT JOIN 连接的外连接一样,只不过多加几行。

按时间段查询科目总额汇总表,包括科目信息、时间范围、期初余额、借方发生额、贷方发生额、期末余额

在此问题中需要用到【日记账分录主表】、【日记账分录子表】、【科目表】。

DECLARE @BeginDate DateTime,@EndDate DateTime
SET @BeginDate=/* FROM JDT1 T0 WHERE T0.RefDate <= */ '[%0]'
SET @EndDate=/* FROM JDT1 T0 WHERE T0.RefDate >= */ '[%1]'SELECT 
T2.FatherNum AS '科目类别',T2.AcctCode AS '科目编号',T2.AcctName AS '科目名称'
,CAST(@BeginDate AS nvarchar(20)) +'~'+CAST(@EndDate AS nvarchar(20)) 日期范围
,SUM(CASE WHEN T0.RefDate<@BeginDate THEN (T1.Debit-T1.Credit) ELSE 0 END) AS '期初余额'
,SUM(CASE WHEN T0.RefDate BETWEEN @BeginDate AND @EndDate THEN T1.Debit ELSE 0 END) AS '借方发生额'
,SUM(CASE WHEN T0.RefDate BETWEEN @BeginDate AND @EndDate THEN T1.Credit ELSE 0 END) AS '贷方发生额'
,SUM(CASE WHEN T0.RefDate<=@EndDate THEN (T1.Debit-T1.Credit) ELSE 0 END) AS '期末余额'
FROM OJDT T0
INNER JOIN JDT1 T1 ON T0.TransId=T1.TransId
INNER JOIN OACT T2 ON T1.Account=T2.AcctCode
WHERE T0.RefDate<=@EndDate
GROUP BY T2.FatherNum,T2.AcctCode,T2.AcctName

6. UNION ALL

在需要创造一个新列时,比如一部分用户需要填入内容 [A],一部分需要填入内容 [B],此时使用 UNION ALL 将两个结构完全一致的表格进行合并,实现上述需求。

:制作一个销售出货单,查出客户编码、客户名称、物料编号、物料名称、出货的物料数量。

这里不能单纯地考虑出货单,需要进一步

SELECT T0.CardCode,T0.CardName,T0.DocDate,T0.DocNum,T1.ItemCode,T1.Dscription,T1.Quantity
FROM ODLN T0
INNER JOIN DLN1 T1 ON T0.DocEntry=T1.DocEntry
WHERE T0.DocDate BETWEEN '[%0]' AND '[%1]' AND T0.CardName = '[%2]'UNION ALLSELECT T0.CardCode,T0.CardName,T0.DocDate,T0.DocNum,T1.ItemCode,T1.Dscription,T1.Quantity*-1
FROM ORDN T0
INNER JOIN RDN1 T1 ON T0.DocEntry=T1.DocEntry
WHERE T0.DocDate BETWEEN '[%0]' AND '[%1]' AND T0.CardName = '[%2]'

查询管理器运行效果:

查询管理器的基本使用见《SAP B1 基础实操 - 查询管理器(基础版)》;代码中 sql server 并不支持的 SAP 查询特殊符号等见《SAP B1 查询管理器 - 新建类别/专用sql语法》

二、一个对比例子

要求:查找买了物料 A00001 的客户的详细信息,包含客户编号、客户名称、电话号码、联系人。

方法一:多表外连接

SELECT DISTINCT T0.CardCode,T0.CardName,T0.CntctPrsn,T0.Phone1
FROM OCRD T0
LEFT JOIN ORDR T1 ON T1.CardCode=T0.CardCode --多表外连接
LEFT JOIN RDR1 T2 ON T1.DocEntry=T2.DocEntry 
WHERE T2.ItemCode = 'A00001'

方法二:子查询

其中会涉及到的子查询见同专栏文章《SQL Server 查询设置 - LIKE/DISTINCT/HAVING/排序》中 四-3 部分

SELECT CardCode,CardName,CntctPrsn,Phone1
FROM OCRD
WHERE CardCode IN (SELECT CardCode -- 子查询
FROM ORDR T0
INNER JOIN RDR1 T1 ON T0.DocEntry=T1.DocEntry
WHERE T1.ItemCode = 'A00001')

 查询结果一致。


http://www.ppmy.cn/ops/138100.html

相关文章

案例分析:嵌入式边缘计算机ARMxy在工商储能柜新能源应用

可再生能源的快速发展和电力市场的改革深化&#xff0c;工商储能技术正逐渐成为企业能源管理和成本优化的重要工具。特别是在一些大型商业和工业场所&#xff0c;储能系统不仅可以平滑负荷曲线&#xff0c;减少电费支出&#xff0c;还能提高电网的稳定性。然而&#xff0c;为了…

前端网络请求:从 XMLHttpRequest 到 Axios

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:前端网络请求&#xff1a;从 XMLHttpRequest 到 Axios 前言 在网络应用中&#xff0c;前后端的数据…

[windows] [C++] 由变量命名引起的血案

今天在开发过程中遇到了一个由于变量命名引起的诡异问题&#xff0c;定位了好久&#xff0c;才发现原因&#xff0c;在此记录一下&#xff1a; 最初的代码是&#xff1a; static bool LoadTestDlls() {// 获取可执行文件路径WCHAR exePath[MAX_PATH];if (GetModuleFileNameW(…

Android.mk的变量有哪些

Android.mk 文件是 Android 构建系统中用于定义模块和依赖关系的 Makefile 文件。它使用一系列变量来指定源文件、库、编译选项等。以下是一些常用的 Android.mk 变量及其用途&#xff1a; 常用变量 模块名称 LOCAL_MODULE: 模块的名称&#xff0c;必须唯一。 LOCAL_MODULE : …

【NLP 1、人工智能与NLP简介】

人人都不看好你&#xff0c;可偏偏你最争气 —— 24.11.26 一、AI和NLP的基本介绍 1.人工智能发展流程 弱人工智能 ——> 强人工智能 ——> 超人工智能 ① 弱人工智能 人工智能算法只能在限定领域解决特定的问题 eg&#xff1a;特定场景下的文本分类、垂直领域下的对…

远离网上的广告和无用信息,自己动手搭建Tipask问答网站

文章目录 前言1.Tipask网站搭建1.1 Tipask网站下载和安装1.2 Tipask网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试4. 结语 前…

信号与系统的工程应用逐章简介(以奥本海姆第二版为例)

《信号与系统》是现代工程领域的重要教材&#xff0c;尤其在电子、通信、控制、信号处理等领域中占有举足轻重的地位。本书通过详细介绍信号和系统的基本理论及应用&#xff0c;帮助工程师和学者构建起处理和分析各种信号的基础框架。以下将从书中的各个章节出发&#xff0c;详…

如何查看ubuntu服务器的ssh服务是否可用

你可以通过以下几种方法检查 Ubuntu 服务器上的 SSH 服务是否可用&#xff1a; 1. 使用 systemctl 检查 SSH 服务状态 首先&#xff0c;检查 SSH 服务是否正在运行&#xff1a; sudo systemctl status ssh如果 SSH 服务正在运行&#xff0c;你会看到类似以下的输出&#xff…