我們有兩個表用于“物理位置”和“商店”。一個物理位置可以有多個商店。每個 Store 可以是 Active 或 Inactive。
我們將如何撰寫查詢來查找那些沒有與之關聯的活動商店的“物理位置”?
物理位置
LocationId LocationAddress
100 Address1
101 Address2
102 Address3
店鋪
StoreID LocationId Status
100A 100 Active
100B 100 Inactive
101C 101 Inactive
102D 101 Inactive
我已經嘗試過類似下面的東西。
Select * from PhysicalLocation where LocationId IN
(Select LocationId from Store where Status <> 'Active')
我的預期結果是
LocationId LocationAddress
101 Address2
由于這個位置只有不活躍的商店
uj5u.com熱心網友回復:
select l.LocationId,l.LocationAddress
from locations as l
where not exists
(
select 1 from stores as s
where l.LocationId=s.LocationId
and s.Status='Active'
)
如果它適合你,請你試試這個。順便說一句,位置 102 也不包含活動商店
uj5u.com熱心網友回復:
用 Joins
SELECT * FROM PhysicalLocation
INNER JOIN Store ON Store.LocationId = PhysicalLocation.LocationId
WHERE Store.Status = 'Inactive'
我已經INNER JOIN假設沒有商店位置,例如102 Address3,與不活躍商店的位置一樣好。
如果假設不正確,并且您希望所有位置以及沒有商店的位置都處于非活動狀態,那么請選擇 LEFT OUTER JOIN
uj5u.com熱心網友回復:
查詢將是這樣的。
SELECT * FROM PhysicalLocation AS Ph INNER JOIN Store AS St ON Ph.LocationId = St.LocationId WHERE St.Status = 'Inactive';
使用 Join 在兩個表之間建立關系。這將為您提供您正在尋找的結果值。
輸出:
LocationId LocationAddress StoreID LocationId Status
100 Address1 100B 100 Inactive
101 Address2 101C 101 Inactive
101 Address2 102D 101 Inactive
uj5u.com熱心網友回復:
您可以使用以下陳述句,它在計數中使用帶有 case 運算式的 have 子句來過濾掉具有活動商店的位置。聯接用于檢索其他位置詳細資訊。
SELECT
P.*
FROM
PhysicalLocation P
INNER JOIN (
SELECT LocationId
FROM Store
GROUP BY LocationId
HAVING COUNT(CASE WHEN Status='Active' THEN 1 END) =0
) SA ON p.LocationId=SA.LocationId
| 位置 ID | 位置地址 |
|---|---|
| 101 | 地址2 |
如果您對所有沒有活動商店的位置感興趣,無論是否創建了商店條目,那么您可以嘗試以下使用左連接和 where 子句來應用過濾器而不是上面的內部連接。
SELECT
P.*
FROM
PhysicalLocation P
LEFT JOIN (
SELECT
LocationId,
COUNT(CASE WHEN Status='Active' THEN 1 END) as no_active_locations
FROM Store
GROUP BY LocationId
) SA ON p.LocationId=SA.LocationId
WHERE SA.no_active_locations=0 OR SA.no_active_locations IS NULL
| 位置 ID | 位置地址 |
|---|---|
| 101 | 地址2 |
| 102 | 地址3 |

這與您指定的所需輸出略有不同,但我懷疑您沒有考慮附加地址。仍然只有 1 個位置沒有活躍的商店。
uj5u.com熱心網友回復:
這是最簡單的解決方案:
select LocationId, LocationAddress from PhysicalLocation
where LocationId in
(
select Distinct (LocationId) from Store
where LocationId not in (select LocationId from Store where Status = 'Active')
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/339050.html
標籤:sql sql-server
下一篇:計數行出現并聚合SQL
