嗨,我仍在学习SQL子查询的来龙去脉,我想知道是否有人可以向我展示以下查询产生的表列标题。试图弄清楚并可视化子查询的工作方式。谢谢!
SELECT
t2.id,
t2.type,
t2.start AS exit,
t2.last,
t2.last_time AS entrnc,
CASE WHEN res.fac IN ('Resort1', 'Resort2', 'Resort3','Resort4',
) THEN 'new_resort'
WHEN res.fac IS NULL THEN 'not_new_res'
ELSE 'other_resort' END AS gst
FROM
(SELECT
id,
start,
type,
Min(start) Over (PARTITION BY id, Cast(start AS DATE) ORDER BY start ROWS BETWEEN 1 Preceding AND 1 Preceding) AS last_time,
Min(type) Over (PARTITION BY id, Cast(start AS DATE) ORDER BY start ROWS BETWEEN 1 Preceding AND 1 Preceding) AS last
QUALIFY ( Min(type) Over (PARTITION BY id ORDER BY start ROWS BETWEEN 1 Preceding AND 1 Preceding) LIKE '%Entrance%')
FROM
(SELECT
f1.*
FROM foo f1
INNER JOIN (SELECT
id
FROM foo
WHERE type = 'Exit'
) AS f2
ON f1.id = f2.id
) t1
) t2
LEFT JOIN reservations res ON res.id = t2.id
WHERE t2.type = 'Exit'
AND t2.last LIKE '%Entrance%'
答案 0 :(得分:0)
SQL子查询的工作原理类似于信息的“子集”。当您想以特定方式“预先安排”数据,或为“联接”准备/过滤数据时,此功能非常有用。
如果您确实是SQL和Subselect的新手,那么您应该尝试了解更简单的情况。
一种很好的理解方式是学习一点“ Sets”。这里有一个非常简单的示例来演示子查询如何工作:
想象一下2张桌子:
product_description
product_code integer,
product_description varchar(50)
product_types
product_code integer,
prodcut_type varchar(50)
select
t1.product_description,
t2.product_type
from
(
select product_code, product_description from product_descriptions
) t1
inner join
(
select product_code, product_type from product_types
) t2
on
t1.product_code = t2.product_code
这不是一个“现实世界”示例,因为此查询的作用与以下内容相同:
select
t1.product_description,
t2.product_type
from
product_descriptions t1
inner join
product_types t2
on
t1.product_code = t2.product_code
但是了解子查询行为实际上非常好。使用大型和复杂的子选择“调试”查询的最佳方法也是从内而外分析每个子集。
如示例所示,您可以使用过滤器,聚合和等级。
要记住的一件事是查询性能。尽管它是非常有用的资源,但是在处理大量数据时,您必须非常仔细地计划查询。
希望这很有用。
致谢