mysql Sql内部联接3表包含表2或表3为空的行
问题: 我试图基于一个条件对多个表进行内部联接,但如果两个内部联接都不返回某些内容,则会将它们过滤掉 例如: 从顶部表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不返回值,则不会显示任何行 像这样的事情是行不通的: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
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)
;