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)
是否可以使用相同的存储插件名称连接两个表?如果是,那么我在这个查询中做错了什么?
您不断更改问题和代码的文本 - 您之前使用的是 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,您将从两个表中获取所有行。不匹配的字段中包含空值。
| 归档时间: |
|
| 查看次数: |
340 次 |
| 最近记录: |