Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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
mysql Sql内部联接3表包含表2或表3为空的行_Mysql_Sql_Inner Join - Fatal编程技术网

mysql Sql内部联接3表包含表2或表3为空的行

mysql Sql内部联接3表包含表2或表3为空的行,mysql,sql,inner-join,Mysql,Sql,Inner Join,问题: 我试图基于一个条件对多个表进行内部联接,但如果两个内部联接都不返回某些内容,则会将它们过滤掉 例如: 从顶部表a中选择* “2019-2-1”和“2019-2-5”之间a.ID=b.ID和c.Date_列上的内部连接第二层b 假设此查询返回20条记录。 及 从顶部表a中选择* “2019-2-1”和“2019-2-5”之间a.ID=c.ID和c.Date_列上的内部联接第二层c 假设此查询返回10条记录 现在,我想将这些结果与单个查询合并,但如果SecondTier1或SecondTie

问题:

我试图基于一个条件对多个表进行内部联接,但如果两个内部联接都不返回某些内容,则会将它们过滤掉

例如:

从顶部表a中选择* “2019-2-1”和“2019-2-5”之间a.ID=b.ID和c.Date_列上的内部连接第二层b

假设此查询返回20条记录。

从顶部表a中选择* “2019-2-1”和“2019-2-5”之间a.ID=c.ID和c.Date_列上的内部联接第二层c

假设此查询返回10条记录

现在,我想将这些结果与单个查询合并,但如果SecondTier1或SecondTier2不返回值,则不会显示任何行

像这样的事情是行不通的:

Select * from TopTable a 
inner join SecondTier1 b on a.ID= b.ID and b.Date_Column between '2019-2-1' and '2019-2-5' 
inner join SecondTier2 c on a.ID= c.ID and c.Date_Column between '2019-2-1' and '2019-2-5' 
它不返回30条记录,而是返回24条记录删除SecondTier1或SecondTier2未加入的记录,但我希望SecondTier1或SecondTier2是否有一个加入将SecondTier1或SecondTier2显示为null,但如果它们都为null则不返回行

我已经尝试了right join,但得到了相同的结果。

您可以使用union

select ...
union all
select ...
希望有帮助

编辑: 好的,假设您在select1中有3列,在select2中有5列,您希望将它们全部显示在一起:


--returns 3 colums
select col1, col2, col3, null col4, null col5
from table1 a, table2 b
where a.id = b.id
and date > .....

union all
-- returns 5 columns
select col1, col2, col3, col4, col5
from table1 a, table2 b
where a.id = b.id
and date > .....

知道我的意思吗? 注意:尝试将您的COL组织为相同类型

尝试以下操作:

选择*
从表a开始
在“2019-2-1”和“2019-2-5”之间的a.ID=b.ID和b.Date_列上左键连接第二层b
在“2019-2-1”和“2019-2-5”之间的a.ID=c.ID和c.Date_列上左键连接第二层c
其中b.DateColumn不为NULL或c.Date\u列不为NULL
注意,您可能会在where子句中使用主键列,但我不知道您正在使用的模式。此外,这是为sql server编写的,因此在语法上可能存在一些非常微小的差异,这些差异应该很容易解释


(我假设问题中有一个输入错误;您的第一个查询无法处理其中的
c
表,因为您没有在那里进行任何类型的联接。)

您需要的是左联接。如果不进行联接,我不希望返回任何行。Left join将接受顶级行,即使它们没有联接。如果TopTable行在该条件下与SecondTier1连接,我只需要TopTable行,但我也需要TopTable行在SecondTier2条件下连接,如果一个或另一个连接,我希望看到它。显示一些示例表数据和预期结果。都是格式化的文本,而不是图像。您可以在where子句中使用b.ID和c.ID。即使它们不是PK,您也知道它们通常必须不为null,以指示已找到联接匹配。@uuerdo,true,您可以使用已知有数据的任何列,但我倾向于按惯例使用主键。(顺便说一句,我也从不使用名为simply ID的主键,这使得在大型查询中更难知道引用的是哪个ID,而TableNameId将使它变得简单,因为它在所有用法中都是一样的。)这确实有效,但查询执行时间非常糟糕。@Watson,是的,左连接几乎总是有糟糕的执行时间。不幸的是,这通常意味着应该考虑更改架构,以消除对左联接的需要。@dmoore1181您没有指定表之间的关系(1:1、1:N等),但应该注意的是,如果
c
b
a
之间的关系为1:N,则结果的数量将成倍增加(例如:如果一条
a
记录有3条关联的
b
记录和4条关联的
c
记录,则该
a
记录的结果将有12行。)您是对的,您可以使用空列手动塑造数据,然后使用UNION。它不像能够将查询表示为一系列条件联接那样干净,但到目前为止,我还没有找到实现我最初目标的方法。
SELECT * 
FROM TopTable a 
LEFT JOIN SecondTier1 b on a.ID= b.ID and c.Date_Column between '2019-2-1' and '2019-2-5' 
LEFT JOIN SecondTier2 c on a.ID= c.ID and c.Date_Column between '2019-2-1' and '2019-2-5' 
WHERE ID IN 
   (
      SELECT ID FROM SecondTier1 WHERE DateColumn BETWEEN '2019-2-1' and '2019-2-5'
      UNION 
      SELECT ID FROM SecondTier2 WHERE DateColumn BETWEEN '2019-2-1' and '2019-2-5'
   )
   AND (b.ID IS NOT NULL OR a.ID IS NOT NULL)
;