簡體   English   中英

使用 SQL 從單個表中進行選擇

[英]Selecting within a selection using SQL from a single table

我必須在另一個查詢中進行查詢,以便在表中找到具有特征但沒有其他特征的條目。 這些特征來自與另一個表的連接。

基本上,我有一個計划表和一個包裹表。 我需要找到與(建築地層、裸地地層、共同所有權)和(道路、細分、公園、利益)相關的計划。 這些計划應在一個列表中包含條目,但不能同時包含兩者。

這是我到目前為止所擁有的。

SELECT * 
FROM parcelfabric_plans 
WHERE 
(name in 
    (select pl.name from parcelfabric_parcels p inner join 
     parcelfabric_plans pl on p.planid = pl.objectid
        WHERE
            p.parcelclass IN ( 'ROAD', 'SUBDIVISION', 'PARK', 'INTEREST')))

這是第一個查詢,它在此列表中獲取所有與他們相關的包裹的計划。 如何查詢此選擇以獲取此選擇中也與第二個列表(細分、興趣、道路、公園)相關的計划?

此查詢返回 268983 個計划結果。 在這些結果中,我希望能夠查詢它們並獲得與細分、興趣、道路、公園相關的計划數量。

這將需要兩個列表中的元素:

select pl.name
from parcelfabric_plans pl
where exists (
    select 1 from parcelfabric_parcels p 
    where p.planid = pl.objectid
        and p.parcelclass in ('ROAD', 'SUBDIVISION', 'PARK', 'INTEREST')
) and exists (
    select 1 from parcelfabric_parcels p 
    where p.planid = pl.objectid
        and p.parcelclass in (<list 2>)
) 

雖然我不清楚要求。 如果您希望它們相互排斥,那么我認為這是一個更好的主意:

with data as (
    select p.planid,
        count(case when p.parcelclass in
            ('ROAD', 'SUBDIVISION', 'PARK', 'INTEREST') then 1 end) as cnt1,
        count(case when p.parcelclass in
            (<list 2>) then 1 end) as cnt2
    from parcelfabric_plans pl inner join parcelfabric_parcels p
        on p.planid = pl.objectid
    -- possible optimization
    /* where p.parcelclass in (<combined list>) */
    group by p.planid
)
select * from data
where cnt1 > 0 and cnt2 = 0 or cnt1 = 0 and cnt2 > 0;

我要感謝大家的評論和回答。 我想出了一個解決方案,雖然它很笨重。 但至少它有效。

    SELECT * 
FROM pmbcprod.pmbcowner.ParcelFabric_Plans 

WHERE 
(name in
    (select pl.name from parcelfabric_parcels p inner join parcelfabric_plans pl on p.planid = pl.objectid
        WHERE
            p.parcelclass IN ('ROAD','INTEREST','SUBDIVISION','PARK') 
)and name in
    (select pl.name from parcelfabric_parcels p inner join parcelfabric_plans pl on p.planid = pl.objectid
        WHERE
            p.parcelclass IN ('BUILDING STRATA','COMMON OWNERSHIP','BARE LAND STRATA')
)
)

我所追求的比我想象的要簡單,我只需要把頭繞在結構上。 它基本上是一個嵌套查詢(子查詢?)。 進行內部查詢,然后圍繞它形成下一個查詢。

再次感謝您,非常感謝。 祝大家歡呼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM