我有一个复杂的查询表,用于识别和之间的SELECT
关系。这是一个表达式的简化:event_id
attribute
VALUES
SELECT event_id, attribute
FROM (
VALUES
(1, '2D'),
(1, 'IMAX'),
(2, 'IMAX'),
(3, '3D')
) event_attribute (event_id, attribute)
我想(event_id, '2D')
为每个event_id
尚未与3D
or2D
属性关联的记录包含一个额外的记录。如何有条件地将行附加到结果集中?
在上表的情况下,预期结果将是:
(1, '2D'),
(1, 'IMAX'),
(2, 'IMAX'),
(2, '2D'),
(3, '3D')
还有一个表格event
,每个相关的id
.
假设(就像稍后添加的那样)一个
event
具有所有相关唯一性的单独表id
- 这有助于提高性能:有关的:
如果您的查询仅返回 all 的一个子集
event_id
,则不能使用该表event
来进行这样的简化。没有表的替代方案event
:这与您自己回答的内容有些相似,只是更短且更快。特别是总
FILTER
条款应该是工具性的。有关的:由于从 CTE 派生的表上没有索引,因此开始第二个查询可能会更快。
cfr。http://sqlfiddle.com/#!17/82868/6
对于较大的数据集可能更快:
见http://sqlfiddle.com/#!17/82868/14
因为,根据已编辑的问题,最好避免重复的“2D”条目,“attribute = '3D'”应替换为“attribute in ('3D','2D')”。
为了记录,这就是我想出的:
但是,我很确定杰拉德的建议更好。
一个直接的解决方案是: