标准SQL:使用BETWEEN通过两个条件进行LEFT JOIN

时间:2018-09-07 06:51:05

标签: sql date google-bigquery left-join

我在BigQuery中有以下查询:

#Standard SQL

SELECT *
FROM `Table_1`     
LEFT JOIN `Table_2` ON (timestamp BETWEEN TimeStampStart AND TimeStampEnd)

但是出现以下错误:

Error: LEFT OUTER JOIN cannot be used without a condition that is an equality of fields from both sides of the join.

如果我使用JOIN而不是LEFT JOIN,它可以工作,但是我想保留Table_1中的所有行(所以也要保留与Table_2不匹配的行)

如何实现?

5 个答案:

答案 0 :(得分:2)

这绝对是愚蠢的...但是,如果您添加一个条件来匹配table1中的列与table2中的列,则相同的查询将起作用:

WITH Table_1 AS (
  SELECT CAST('2018-08-15' AS DATE) AS Timestamp, 'Foo' AS Foo
  UNION ALL
  SELECT CAST('2018-09-15' AS DATE), 'Foo'
), Table_2 AS (
  SELECT CAST('2018-08-14' AS DATE) AS TimeStampStart, CAST('2018-08-16' AS DATE) AS TimeStampEnd, 'Foo' AS Bar
)
SELECT *
FROM Table_1
LEFT JOIN Table_2 ON Table_1.Foo = Table_2.Bar AND Table_1.Timestamp BETWEEN Table_2.TimeStampStart AND Table_2.TimeStampEnd

查看您是否还有其他可使用的匹配条件(例如,在相等性上链接table1和table2的另一列)。

答案 1 :(得分:1)

左联接始终等于的UNION:

同一连接谓词上相同两个参数之间的INNER JOIN,以及 没有找到匹配行的第一个参数的行集(并为从第二个参数保留的所有列正确地扩展了空值)

后一部分可以写为

SELECT T1。*,作为T2_C1为空,作为T2_C2为空,...   从T1  不存在的地方(从T2 WHERE中选择*)

因此,如果您拼出了UNION,就应该能够到达那里。

答案 2 :(得分:0)

有趣。这对我来说适用于标准SQL:

select *
from (select 1 as x) a left join
     (select 2 as a, 3 as b) b
     on a.x between b.a and b.b

我怀疑您正在使用旧版SQL。这样切换到标准SQL。 (并将括号放在between之后。)

问题是:

#(Standard SQL)#

这什么也没做。使用:

#StandardSQL

答案 3 :(得分:0)

根据文档,嗨,“(”具有特殊含义,因此请尝试不使用括号。

<?xml version="1.0" encoding="UTF-8"?><tns:string xmlns:etd="uri " xmlns:tns="uri" xmlns:xsi="uri"> <tns:RootNode > <tns:SomeNode> <tns:AnotherNode>Value</NS:AnotherNode> </tns:SomeNode> </tns:RootNode>

Documentation here

答案 4 :(得分:0)

您必须写Table_1,而不是写(*)。 *等。

选择

表_1。 *,表_2。 *

Table_1左联接Table_2

打开

(TimeStampStart和TimeStampEnd之间的时间戳记)