Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从第一个表中获取所有数据,即使联接表中不存在联接项_Sql Server_Join - Fatal编程技术网

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不清楚的问题应被否决、否决和评论,以要求澄清,而不是猜测。