在具有相同插件和相同数据类型的SQL Server表上连接时出现问题

San*_*jiv 5 sql-server apache-drill

我想使用相同的存储插件加入两个表.但其中一列显示空值.我正在使用此查询: -

select * from SqlServer.test_mopslive.reports as Reports join     
 SqlServer.test_mopslive.reportsetting as ReportSetting on Reports.ID = ReportSetting.ID
Run Code Online (Sandbox Code Playgroud)

SqlServer是存储插件名称,test_mopslive是数据库名称reports,reportsetting是表名称.

执行此查询时T_ID显示Null.

但如果我使用两个不同的存储插件名称和相同的凭据,它可以正常工作.

表格1:-

create table Reports (ID bigint, Name varchar(25)); 

insert into Reports values (29, 'SqlThree'); 
insert into Reports values (30, 'SqlTwo'); 
insert into Reports values (31, 'SqlThree'); 
Run Code Online (Sandbox Code Playgroud)

TABLE 2:-

CREATE TABLE ReportSetting 
( 
P_id bigint not null auto_increment primary key, 
Name varchar(25), 
ID bigint, 
CONSTRAINT fk_ID FOREIGN KEY (ID) 
REFERENCES Reports(ID)); 

insert into ReportSetting values (1,'My_Sreekant1', 29); 
insert into ReportSetting values (2,'My_Sreekant2', 30); 
insert into ReportSetting values (3,'My_Sreekant3', 31);
Run Code Online (Sandbox Code Playgroud)

是否可以使用相同的存储插件名称连接两个表?如果是,那么我在这个查询中做错了什么?

Eri*_*ric 0

您不断更改问题和代码的文本 - 您之前使用的是 RIGHT OUTER JOIN,而现在,您使用的是与 INNER JOIN 相同的普通 JOIN。

由于您使用的是 INNER JOIN,因此您不会从任一表中获取任何不满足连接条件的行:

join SqlServer.test_mopslive.reportsetting ReportSetting
on Reports.ID = ReportSetting.ID
Run Code Online (Sandbox Code Playgroud)

如果您运行此查询(针对 SQL Server - 我不知道 Drill 是如何工作的),您将不会有任何 Reports.ID 或 ReportSetting.ID 不相等的行,也不会有任何其中任何一个为 null 的行。这意味着,如果报表在 ReportSetting 表中没有任何条目,则该报表不会显示在您的结果集中,并且,如果 ReportSetting 在 Reports 表中没有匹配项,则它不会显示在您的结果集中。

如果您使用的是 RIGHT OUTER JOIN,您将获取 JOIN目标表 (ReportSetting)中的所有行,其中数据来自 JOIN(报告)(如果可用),否则这些字段中的数据为 null。

如果您使用 LEFT OUTER JOIN,您将获得 JOIN表(报告)中的所有行,其中来自 JOIN目标(报告设置)的数据可用,否则这些字段中的数据为空。

如果您使用的是 FULL OUTER JOIN,您将从两个表中获取所有行。不匹配的字段中包含空值。