如何选择没有实际分组项的分组

时间:2019-02-14 22:02:59

标签: mysql google-bigquery

我有一个以此方式设置的表:

doc product
a   2
a   1
a   1
b   1
c   3
c   2
d   1

我需要选择与订购产品1具有相同文档ID的所有项目,但实际上不将文档中的所有项目分组。

因此最终结果应如下所示:

doc product
a   2
a   1
a   1
b   1
d   1

有没有一种方法可以实现这种选择?

3 个答案:

答案 0 :(得分:0)

您是否有任何不想在此处使用普通联接或子查询的原因?

类似以下内容:

Select * from table where doc in (
  select doc from table where product = 1
) t1 ;

答案 1 :(得分:0)

以下是用于BigQuery标准SQL

displayFn(payee?: Payee): string | undefined {
  if ((payee.company !== '' || null) && (payee.first_name !== '' || null  && payee.last_name !== '' || null)) {
    return payee ? payee.company  + ' - ' + payee.first_name + ' ' + payee.last_name : undefined;
  } else if (!payee.company) {
    return payee ? payee.first_name + ' ' + payee.last_name + ' ' + payee.company : undefined;
  } else if ((payee.company !== '' || null) && (payee.first_name === '' || null && payee.last_name === '' || null)) {
    return payee ? payee.company : undefined;
  }
}

private _filter(name: string): Payee[] {
  const filterValue = name.toLowerCase();

  return this.payees.filter(option =>
   option.first_name.toLowerCase().indexOf(filterValue) === 0 ||
   option.last_name.toLowerCase().indexOf(filterValue) === 0 ||
   option.company.toLowerCase().indexOf(filterValue) === 0);
}

和纯BigQuery专用选项(用于娱乐和学习):

#standardSQL
SELECT *
FROM `project.dataset.table`
WHERE doc IN (SELECT DISTINCT doc FROM `project.dataset.table` WHERE product = 1)  

答案 2 :(得分:-1)

SELECT *
FROM yourTable
WHERE doc IN (
    SELECT doc
    FROM yourTable
    WHERE product = 1)

子查询查找订购产品1的所有文档。然后,主查询查找包含这些文档的所有行。

SELECT t1.*
FROM yourTable AS t1
JOIN (
    SELECT DISTINCT doc
    FROM yourTable
    WHERE product = 1) AS t2
ON t1.doc = t2.doc

DISTINCT可以防止所有行重复子查询返回的doc的次数。

如果表很大,我建议使用第二种方法,因为MySQL在WHERE xxx IN (subquery)查询中存在一些臭名昭著的性能问题。