Sql server 从第一个表中获取所有数据,即使联接表中不存在联接项
我有四个表,分类账,会计科目表,会计科目表,会计科目表Sql server 从第一个表中获取所有数据,即使联接表中不存在联接项,sql-server,join,Sql Server,Join,我有四个表,分类账,会计科目表,会计科目表,会计科目表 CREATE TABLE AccDetail (DetailID int, MasterID int, LedgerID int, Credit decimal(18, 2)); INSERT INTO AccDetail VALUES (1, 1, 1, 500), (2,2,2,1000);
CREATE TABLE AccDetail (DetailID int,
MasterID int,
LedgerID int,
Credit decimal(18, 2));
INSERT INTO AccDetail
VALUES (1, 1, 1, 500), (2,2,2,1000);
CREATE TABLE Ledgers (ID int,
Name varchar(10),
AccGroupID int);
INSERT INTO Ledgers
VALUES (1, 'A', 1),
(2, 'B', 1);
CREATE TABLE AccMaster (MasterID int,
Date date);
INSERT INTO AccMaster
VALUES (1, '2019-11-04'),
(2, '2019-11-03');
CREATE TABLE AccGroup (ID int,
Name varchar(10));
INSERT INTO AccGroup
VALUES (1, 'Accounts'),
(2, 'Others');
SELECT AL.Name,
SUM(AD.Credit)
FROM AccDetail AD
LEFT OUTER JOIN Ledgers AL ON AL.ID = AD.LedgerID
LEFT OUTER JOIN AccMaster AM ON AM.MasterID = AD.MasterID
LEFT OUTER JOIN AccGroup AG ON AG.ID = AL.AccGroupID
WHERE AM.Date = '2019-11-04'
GROUP BY AL.Name;
即使分类账表中有两个分录,我也只得到分类账表中一个分录的结果。这是因为其他表中没有对应的分类账条目。我找到了很多关于左连接和右连接的答案,但是没有一个符合我的愿望
我想从分类账表中获取所有条目,即使其他表中没有该分类账的数据
我想得到的结果
MS SQL Server 2017架构设置:
CREATE TABLE AccDetail (DetailID int,
MasterID int,
LedgerID int,
Credit decimal(18, 2));
INSERT INTO AccDetail
VALUES (1, 1, 1, 500);
CREATE TABLE Ledgers (ID int,
Name varchar(10),
AccGroupID int);
INSERT INTO Ledgers
VALUES (1, 'A', 1),
(2, 'B', 1);
CREATE TABLE AccMaster (MasterID int,
Date date);
INSERT INTO AccMaster
VALUES (1, '2019-11-04'),
(2, '2019-11-03');
CREATE TABLE AccGroup (ID int,
Name varchar(10));
INSERT INTO AccGroup
VALUES (1, 'Accounts'),
(2, 'Others');
SELECT AL.Name,
ISNULL(SUM(AD.Credit),0) AS SumOfCredits
FROM Ledgers AL
LEFT OUTER JOIN AccDetail AD ON AL.ID = AD.LedgerID
LEFT OUTER JOIN AccMaster AM ON AM.MasterID = AD.MasterID
LEFT OUTER JOIN AccGroup AG ON AG.ID = AL.AccGroupID
WHERE AM.Date = '2019-11-04' OR AM.Date IS NULL
GROUP BY AL.Name
| Name | SumOfCredits |
|------|--------------|
| A | 500 |
| B | 0 |
查询1:
CREATE TABLE AccDetail (DetailID int,
MasterID int,
LedgerID int,
Credit decimal(18, 2));
INSERT INTO AccDetail
VALUES (1, 1, 1, 500);
CREATE TABLE Ledgers (ID int,
Name varchar(10),
AccGroupID int);
INSERT INTO Ledgers
VALUES (1, 'A', 1),
(2, 'B', 1);
CREATE TABLE AccMaster (MasterID int,
Date date);
INSERT INTO AccMaster
VALUES (1, '2019-11-04'),
(2, '2019-11-03');
CREATE TABLE AccGroup (ID int,
Name varchar(10));
INSERT INTO AccGroup
VALUES (1, 'Accounts'),
(2, 'Others');
SELECT AL.Name,
ISNULL(SUM(AD.Credit),0) AS SumOfCredits
FROM Ledgers AL
LEFT OUTER JOIN AccDetail AD ON AL.ID = AD.LedgerID
LEFT OUTER JOIN AccMaster AM ON AM.MasterID = AD.MasterID
LEFT OUTER JOIN AccGroup AG ON AG.ID = AL.AccGroupID
WHERE AM.Date = '2019-11-04' OR AM.Date IS NULL
GROUP BY AL.Name
| Name | SumOfCredits |
|------|--------------|
| A | 500 |
| B | 0 |
:
CREATE TABLE AccDetail (DetailID int,
MasterID int,
LedgerID int,
Credit decimal(18, 2));
INSERT INTO AccDetail
VALUES (1, 1, 1, 500);
CREATE TABLE Ledgers (ID int,
Name varchar(10),
AccGroupID int);
INSERT INTO Ledgers
VALUES (1, 'A', 1),
(2, 'B', 1);
CREATE TABLE AccMaster (MasterID int,
Date date);
INSERT INTO AccMaster
VALUES (1, '2019-11-04'),
(2, '2019-11-03');
CREATE TABLE AccGroup (ID int,
Name varchar(10));
INSERT INTO AccGroup
VALUES (1, 'Accounts'),
(2, 'Others');
SELECT AL.Name,
ISNULL(SUM(AD.Credit),0) AS SumOfCredits
FROM Ledgers AL
LEFT OUTER JOIN AccDetail AD ON AL.ID = AD.LedgerID
LEFT OUTER JOIN AccMaster AM ON AM.MasterID = AD.MasterID
LEFT OUTER JOIN AccGroup AG ON AG.ID = AL.AccGroupID
WHERE AM.Date = '2019-11-04' OR AM.Date IS NULL
GROUP BY AL.Name
| Name | SumOfCredits |
|------|--------------|
| A | 500 |
| B | 0 |
你能分享你的输入和期望的输出吗?为什么你会期望多行
AccDetail
只有一行。为什么要加入accmaster和accgroup?你在查询中不使用它们中的任何内容?我删除了findle并将DDL和DML放入你的问题中,@faheemKurikkal,由于用户不应期望访问其他站点来回答您的问题。“我希望从分类账表中获取所有条目”-那么您需要从分类账而不是accdetail中驾驶。如果AccMaster没有where条件,您的答案是正确的。请检查更新的问题。AccMaster.Date有一个where条件。就我个人而言,我想把AM.Date
上的子句移到上的上。您的两个查询@xXx都不起作用。where条件很重要查询1和查询2是什么?PS这个问题并没有说通常需要什么样的输出,那么为什么这个答案的任何部分都应该是答案呢?PS不清楚的问题应该被否决、否决和评论,以要求清楚,而不是猜测。@faheemKurikkal你在sqlfiddle上检查过我的答案了吗?它只给出一个分类账“A”的结果。即使没有B的条目,它也应该显示“B”0。问题并没有说明通常需要什么输出,所以为什么这应该是一个答案?PS不清楚的问题应被否决、否决和评论,以要求澄清,而不是猜测。