子查询输出

时间:2018-07-16 12:30:55

标签: sql subquery

嗨,我仍在学习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%'

1 个答案:

答案 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

但是了解子查询行为实际上非常好。使用大型和复杂的子选择“调试”查询的最佳方法也是从内而外分析每个子集。

如示例所示,您可以使用过滤器,聚合和等级。

要记住的一件事是查询性能。尽管它是非常有用的资源,但是在处理大量数据时,您必须非常仔细地计划查询。

希望这很有用。

致谢