我有一个问题,我最近有很多问题,找到一个解决方案会很棒。
假设我们有两个表Table1
和Table2
。有没有办法在有或没有条件的情况下对这些表格进行join
?
例如:
Select * from Table1 t1 left join Table2 t2 on t1.column = t2.column where t2.anothercolumn in (v1,v2,v3) and ...;
Select * from Table1 t1 left join Table2 t2 on t1.column = t2.column where t2.anothercolumn in ('') and ....;
所以在这两种情况下,我希望能够进行联接,如果我在t2
列上指出一个条件,那么它会显示与之相关的结果,否则会显示所有内容。
目前如果我放in('')
它就不会显示任何内容。
提前致谢。
答案 0 :(得分:0)
执行left join
时, second 表中的条件会进入ON
子句:
Select *
from Table1 t1 left join
Table2 t2
on t1.column = t2.column and
t2.anothercolumn in (v1, v2, v3) and ...;
第一个表中的条件放在where
子句中。这似乎是一个神秘的规则。但是如果你理解了潜在的机制,那就很有道理了。
left join
保留 first 表中的所有行,无论on
子句是否计算为true。因此,第一个表上的条件对结果没有影响(因为left join
无论如何都保留了第一个记录。)
另一方面,您的版本将left join
转换为inner join
,因为当NULL
子句正在处理它们时,第二个表上的值为where
。
答案 1 :(得分:0)
您提到的要求要求使用内部联接。 左连接将从左表中获取所有记录并从右表中匹配记录。如果要在两个表的交集上应用过滤器,请使用内连接。
答案 2 :(得分:0)
Process MySQL处理查询的第一个Do From子句是你的左连接,然后是你指定的列的where子句,而不是它根据select子句中选择的列生成结果集
(问)如果我把它放进去('')它就不会显示任何东西。 原因是它会查找您在where子句中指定的列,并查找它是否包含''如果是,那么如果不是零行显示结果
答案 3 :(得分:0)
Select *
from Table1 t1 left join
Table2 t2
on t1.column = t2.column and
t2.anothercolumn in (coalesce (@input, t2.anothercolumn)) and ...
where t1.someColumnName is NOT NULL or @value is NULL
;
如果@input不为null,则返回所有字段,否则将返回过滤字段。