如何在单个条目匹配时 select 整个记录
How to select an entire record when a single entry matches
我有一个案例需要聚合数据,并且我在每一行中嵌套了一条记录。我想做的是查看记录中的条目是否匹配,然后 return 完整记录,因为我对那里的其他数据感兴趣。这是我拥有的数据的基本模式
|- name
|- age
+- properties (repeated)
| |- key
| |- value
所以select像这样
SELECT
<some-columns>
FROM
<table>
WHERE
propeties.key = "candy"
只会 return 记录具有匹配 "candy" 而不是 "game" 的键的行。希望这能让我的问题更清楚。
你在使用 SQL 吗?
"properties" 的真实结构是什么?
您应该使用内部联接来查找 "candy"。
然后一个外连接来匹配 "game" 并只保留那些为空的。
SELECT id, name, age
FROM table
INNER JOIN properties AS p1
ON table.id = p1.table_id AND p1.value = "candy"
LEFT OUTER JOIN properties AS p2
ON table.id = p2.table_id AND p2.value = "game"
WHERE p2.value IS null;
不知道这样行不行。
使用 postgresql,sub-select 非常有效:
SELECT id, name, age
FROM table
INNER JOIN (SELECT table_id FROM PROPERTIES WHERE value = "candy" ) AS p1
ON table.id = p1.table_id
LEFT OUTER JOIN (SELECT table_id FROM PROPERTIES WHERE value = "game" ) AS p2
ON table.id = p2.table_id
WHERE p2.table_id IS null;
在 BigQuery 中,您可以为此目的使用 OMIT RECORD IF 子句:
SELECT
<some-columns>
FROM
<table>
OMIT RECORD IF
EVERY(propeties.key != "candy")
我有一个案例需要聚合数据,并且我在每一行中嵌套了一条记录。我想做的是查看记录中的条目是否匹配,然后 return 完整记录,因为我对那里的其他数据感兴趣。这是我拥有的数据的基本模式
|- name
|- age
+- properties (repeated)
| |- key
| |- value
所以select像这样
SELECT
<some-columns>
FROM
<table>
WHERE
propeties.key = "candy"
只会 return 记录具有匹配 "candy" 而不是 "game" 的键的行。希望这能让我的问题更清楚。
你在使用 SQL 吗?
"properties" 的真实结构是什么?
您应该使用内部联接来查找 "candy"。
然后一个外连接来匹配 "game" 并只保留那些为空的。
SELECT id, name, age
FROM table
INNER JOIN properties AS p1
ON table.id = p1.table_id AND p1.value = "candy"
LEFT OUTER JOIN properties AS p2
ON table.id = p2.table_id AND p2.value = "game"
WHERE p2.value IS null;
不知道这样行不行。
使用 postgresql,sub-select 非常有效:
SELECT id, name, age
FROM table
INNER JOIN (SELECT table_id FROM PROPERTIES WHERE value = "candy" ) AS p1
ON table.id = p1.table_id
LEFT OUTER JOIN (SELECT table_id FROM PROPERTIES WHERE value = "game" ) AS p2
ON table.id = p2.table_id
WHERE p2.table_id IS null;
在 BigQuery 中,您可以为此目的使用 OMIT RECORD IF 子句:
SELECT
<some-columns>
FROM
<table>
OMIT RECORD IF
EVERY(propeties.key != "candy")