我需要在一個表格中選擇行,比如說:
在表格中選擇所有符合這兩個條件的行:
條件1:值列不應該與表v中的任何值相匹配
條件2:沒有任何子代(任何級別,即:子代或子代,子代等)的值與表v中的任何值相匹配
表v看起來像這樣:
示例表格的預期結果。是否應該選擇/回傳[行]?
- a1: 不 - 條件 2
- a2: 不 - 條件 2 。
- a3: 沒有 - 條件1
- a4: 沒有--條件1 a5: 是的 - (值在v中不匹配,并且沒有在v中匹配的后裔)
為了便于討論,讓我們添加另一行,導致id為a8和a9的行為 "NO",因為它是a9的子行,并且有來自第二張表的值
INSERT INTO a
([id], [parentId], [value] )
VALUES[/span
('a10'/span>, 'a9'/span>, 35)
GO
測驗2結果集(符合預期)
uj5u.com熱心網友回復:
這變得有些復雜,但我創建了一個CTE,其中有一條記錄,包含了祖先和后代的每個組合的Path(轉義閉合)。然后,我創建了第二個CTE,從Path的開頭提取父代id,從Path的結尾提取子代id,并查詢子代的值。然后,最后,我查詢第二個CTE,并使用NOT EXISTS來過濾這些行。
WITH tree
AS
(
SELECT a.id, a.parentId, a.value,
CAST('/' a.id。 id as varchar(1000) as Path
FROM a
UNIONALL
SELECT a.id, a.parentId, a.value。
CAST(t.Path '/' a. id as varchar(1000)) as Path
FROM a
INNER JOIN tree t
ON Path LIKE '%/' a.parentId
),
???
AS
(
SELECT t.Path。
RIGHT(LEFT(t.Path,3),2)。as parent_id。
RIGHT(t.Path,2) as descendant_id。
(SELECT q. [value]
FROM a q.
WHERE q.id = RIGHT(t.Path,2)
) as [ descendant_value]
FROM tree t
)
SELECT *
FROM DT dt_outer
WHERE NOT EXISTS (SELECT 1 FROM DT dt_inner WHERE dt_inner。 parent_id = dt_outer.parent_id and
dt_inner.descendant_value IN (SELECT [value] FROM v)
ORDER BY 2, 3
我留下了有重復的結果集,以便更清楚地了解發生了什么。你可以用DISTINCT parent_id來完成,以獲得唯一的id。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311038.html
標籤:



