Sql 基于Case语句连接两个表

Sql 基于Case语句连接两个表,sql,database,google-bigquery,Sql,Database,Google Bigquery,我有两张桌子。我想在同一列上连接它们,但用于连接它们的值不同 e、 g从中选择* 表A连接表B 在A.name=B.name上 但是在我的例子中,A.name和B.name不是同一个A.name='apple'应该连接到B.name='apple'或B.name='orange'所在的B中的每一行。这是否可以使用Case语句或其他方式实现?您可以在on子句中使用更复杂的逻辑: from a join b on a.name = 'apple and b.name in ('a

我有两张桌子。我想在同一列上连接它们,但用于连接它们的值不同

e、 g从中选择* 表A连接表B 在A.name=B.name上


但是在我的例子中,A.name和B.name不是同一个A.name='apple'应该连接到B.name='apple'或B.name='orange'所在的B中的每一行。这是否可以使用Case语句或其他方式实现?

您可以在
on
子句中使用更复杂的逻辑:

from a join
     b
     on a.name = 'apple and b.name in ('apple', 'orange')
这是否可能使用Case语句

下面是BigQuery标准SQL的简化/虚拟示例

#standardSQL
WITH `project.dataset.tableA` AS (
  SELECT 1 colsA, 'apple' name union all
  SELECT 2, 'lemon' union all
  SELECT 3, 'peach'
), `project.dataset.tableB` AS (
  SELECT 4 colsB, 'apple' name union all
  SELECT 5, 'orange' union all
  SELECT 6, 'melon'
)
SELECT 
  a.name AS a_name,
  b.name AS b_name,
  colsA,
  colsB
FROM `project.dataset.tableA` a
JOIN `project.dataset.tableB` b
ON CASE 
    WHEN a.name = 'apple' AND b.name IN ('apple', 'orange') THEN TRUE
    WHEN a.name = 'peach' AND b.name IN ('peach', 'melon') THEN TRUE
  END  
对于输出:

Row a_name  b_name  colsA   colsB    
1   apple   apple   1       4    
2   apple   orange  1       5    
3   peach   melon   3       6      
。。。还是其他方式

即使是上述的简化版本也是如此

#standardSQL
SELECT 
  a.name AS a_name,
  b.name AS b_name,
  colsA,
  colsB
FROM `project.dataset.tableA` a
JOIN `project.dataset.tableB` b
ON (a.name = 'apple' AND b.name IN ('apple', 'orange'))
OR (a.name = 'peach' AND b.name IN ('peach', 'melon'))    
显然,对于相同的输出,请尝试以下方法:

SELECT * FROM A a
    INNER JOIN B b ON a.name = 'Apple' AND b.name IN ('Apple', 'Orange')
#standardSQL
SELECT 
  a.name AS a_name,
  b.name AS b_name,
  colsA,
  colsB
FROM `project.dataset.tableA` a
JOIN `project.dataset.tableB` b
ON (a.name = 'apple' AND b.name IN ('apple', 'orange'))
OR (a.name = 'peach' AND b.name IN ('peach', 'melon'))    
SELECT * FROM A a
    INNER JOIN B b ON a.name = 'Apple' AND b.name IN ('Apple', 'Orange')