【原】SQL with的用法实例

本文介绍了SQL中使用WITH子句进行数据聚合和实体关联的操作,通过实例展示了如何使用WITH子句来创建临时表,以及如何在后续查询中利用这些临时表进行复杂的数据筛选和聚合。同时,还涉及了实体属性的设置和数据更新的流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DECLARE @City TABLE(
    ID INT IDENTITY(1,1),
    NAME NVARCHAR(50),
    ParentID INT NULL
)

INSERT INTO @City
VALUES ('上海市', NULL), ('江苏省', NULL), ('浙江省', NULL),
        ('徐汇区', 1), ('闵行区', 1), ('黄浦区', 1),
        ('南京市', 2), ('苏州市', 2), ('常州市', 2),
        ('杭州市', 3), ('温州市', 3), ('余姚市', 3)

--SELECT * FROM @City

;WITH tempCity (Id, NAME, ParentID, CityLevel)
AS
(
    SELECT
        ID, NAME, ParentID, 0 AS CityLevel
    FROM
        @City
    WHERE
        ParentID IS NULL
    UNION ALL
    SELECT
        c.ID, c.NAME, c.ParentID, CityLevel + 1
    FROM
        @City c
    JOIN
        tempCity t
    ON
        c.ParentID = t.Id
)

SELECT * FROM tempCity

 

例子2:

;WITH entities(entityId, setEntityFieldTaskTypeId, valueToSet)  AS (
    SELECT 
        customerID,
,
        CAST('8' AS VARCHAR(20))
    FROM 
        ADMIN.dbo.customers WITH(NOLOCK)
    WHERE
        customerID = 13255
    UNION ALL
    SELECT
        cia.iproBrokerID,
,
        CAST('0' AS VARCHAR(20))
    FROM
        ADMIN.dbo.customerIproAccounts cia WITH(NOLOCK), entities e
    WHERE
        cia.customerID = e.entityId AND
        e.setEntityFieldTaskTypeId = 4
    UNION ALL
    SELECT
        bm.eProBrokerID,
,
        CAST('False' AS VARCHAR(20))
    FROM
        dbo.brokerMappings bm WITH(NOLOCK), entities e
    WHERE
        BM.iProBrokerID = e.entityId AND
        e.setEntityFieldTaskTypeId = 3
)

--SELECT * FROM entities

SELECT
    st.*
FROM
    dbo.scheduledTask st WITH(NOLOCK)
INNER JOIN
    dbo.setEntityFieldTask seft WITH(NOLOCK)
ON
    st.scheduledTaskId = seft.scheduledTaskId
INNER JOIN
    entities e
ON
    e.entityId = seft.entityId AND
    e.setEntityFieldTaskTypeId = seft.setEntityFieldTaskTypeId AND
    e.valueToSet = seft.valueToSet
WHERE
    st.taskStatusId = 1

 

转载于:https://www.cnblogs.com/luckylei66/archive/2012/06/07/2540174.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值