【问题标题】:Joining two tables to keep selected values and nulls连接两个表以保留选定的值和空值
【发布时间】:2021-05-20 08:42:23
【问题描述】:

我有两张表需要加入。第二个表用于过滤第一个表中的记录。

  • table1.参数
  • table2.参数; table2.parameter_group

结果应包括 table1 中某个 parameter_group 的所有记录,还应包括参数为 null 的记录。
我所拥有的是:

table1 LEFT JOIN table2  
ON table1.parameter=table2.parameter  
WHERE table2.parameter_group IS 'A' OR table1.parameter IS NULL

我的问题是 - 这是实现目标的最有效方式吗?关键是每个过滤器(parameter_group IS 'A' OR table1.parameter IS NULL)只针对非常大的 table1 中的百分之几的记录。 我认为这是关于澄清(向我解释)处理顺序...谢谢您的帮助。

【问题讨论】:

  • 您的查询和 Gordon 的答案返回不同的答案集。您的查询(在修复了无效的 IS 'A' 语法之后)会导致内部联接,而 Gordon 会返回所有行。

标签: sql teradata


【解决方案1】:

如果您想要 table1 中的所有行以及来自 table2 的匹配 parameter_group = 'A',则将条件移至 ON

table1 LEFT JOIN
table2  
ON table2.parameter = table1.parameter  AND
   table2.parameter_group = 'A' 

您的方法并不总是有效。如果table2有一个参数not'A',那么会被过滤掉。

【讨论】:

  • 嗨,戈登,感谢您的回复。这正是我想要实现的 - 来自 table1 的某个 parameter_group 的记录,例如'A' AND 空值。
【解决方案2】:

所以您想要 table1.parameter 为 NULL 的所有行加上 table1.parameter 与 table2 中具有 table2.parameter_group='A' 的行匹配的所有行?

table1 LEFT JOIN table2  
ON table1.parameter=table2.parameter /* matching condition */
  AND table2.parameter_group = 'A' /* only try to match these rows */
WHERE table1.parameter IS NULL /* keep rows with NULL from table1 */
  OR table2.parameter IS NOT NULL /* plus keep matched rows */

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 2015-06-19
    • 2019-12-22
    • 1970-01-01
    • 2015-07-13
    • 2021-05-08
    • 2021-06-26
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多