2015-01-13 39 views
1

我有一个表,并想用它作为我输入一个查询从另一台拉:拿一个表作为输入和输出使用另一个表的BigQuery

输入表:

+----------+--------+ 
    | item | period | 
    +----------+--------+ 
    | HD.4TB |  6 | 
    | 12333445 |  7 | 
    | 12344433 |  5 | 
    +----------+--------+ 

我“使用这个查询使用输入M:

SELECT 
snapshot, 
item_name, 
commodity_code, 
planning_category, 
type, 
SUM(quantity) qty, 
sdm_month_start_date, 
FROM planning_extract 
WHERE 
planning_category IN (SELECT item FROM input) 
GROUP BY snapshot, 
item_name, 
commodity_code, 
planning_category, 
type, 
sdm_month_start_date 

的问题是输入表,如果它是字符串,那么它应该是planning_category;如果它是数字,那么它是item_name。我在想什么东西能让意义是改变“其中”条款上面:

WHERE (planning_category or item_name) IN (SELECT item FROM input) 

但是这给了我错误说“表达的半连接(即‘X IN(SELECT ...)’)必须成为其中的一部分逻辑与“。

那么有没有办法做到这一点?

谢谢。

+1

'WHERE( planning_category IN(SELECT item FROM input)或item_name IN(SELECT item FROM input))'? – Turophile

回答

0

这个问题似乎是一个SQL问题,而不是一个大问题。作为Turophile在他的评论中指出,正确的语法应为

WHERE (planning_category IN (SELECT item FROM input) OR item_name IN (SELECT item FROM input)) 
0

我相信谷歌没有让我们使用INOR S,只有在AND秒。这真的很糟糕,我也面临同样的问题。

解决方案

WHERE (planning_category IN (SELECT item FROM input) OR item_name IN (SELECT item FROM input)) 

解决这个问题,你会得到同样的错误Semijoin expression (i.e. "x IN (SELECT ...)") must be a part of logical AND.

+1

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – DavidPostill

+0

@DavidPostill我有一个答案,只是把它放在警告之后。现在我先回答问题 – Kostis

1

这些都是等价的:

1.

SELECT word, corpus FROM [publicdata:samples.shakespeare] 
WHERE (word OR corpus) IN (SELECT x FROM (SELECT 'hamlet' x), (SELECT 'about' x)) 

2.

SELECT word, corpus FROM [publicdata:samples.shakespeare] 
WHERE word IN (SELECT x FROM (SELECT 'hamlet' x), (SELECT 'about' x)) 
OR corpus IN (SELECT x FROM (SELECT 'hamlet' x), (SELECT 'about' x)) 

3.

SELECT word, corpus 
FROM (
    SELECT word, corpus FROM [publicdata:samples.shakespeare] 
    WHERE word IN (SELECT x FROM (SELECT 'hamlet' x), (SELECT 'about' x)) 
), (
    SELECT word, corpus FROM [publicdata:samples.shakespeare] 
    WHERE corpus IN (SELECT x FROM (SELECT 'hamlet' x), (SELECT 'about' x)) 
) 

BigQuery中的第三一个工作 - 但可能会产生一些重复。

为了防止重复(1排在这种情况下):

SELECT word, corpus 
FROM (
    SELECT word, corpus FROM [publicdata:samples.shakespeare] 
    WHERE word IN (SELECT x FROM (SELECT 'hamlet' x), (SELECT 'about' x)) 
), (
    SELECT word, corpus FROM [publicdata:samples.shakespeare] 
    WHERE corpus IN (SELECT x FROM (SELECT 'hamlet' x), (SELECT 'about' x)) 
    AND word NOT IN (SELECT x FROM (SELECT 'hamlet' x), (SELECT 'about' x)) 
) 

(更换(SELECT '约' X与你喜欢的表 '哈姆雷特' X),(SELECT))

相关问题