我在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不匹配的行)
如何实现?
答案 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>
答案 4 :(得分:0)
您必须写Table_1,而不是写(*)。 *等。
选择
表_1。 *,表_2。 *
从
Table_1左联接Table_2
打开
(TimeStampStart和TimeStampEnd之间的时间戳记)