2010-10-07 144 views
1

我有以下2個表幫助構建SQL查詢

Channels: 
Id int PK 
Title varchar 

SubChannels: 
ChannelId int 
SubchannelId int 

當我收到來自服務我試圖把它堅持到SQL數據。我收到一些Channel實例,所以我將它存儲在Channels表中,之後我試圖保留每個子通道(每個通道都包含子通道列表),因此,我將子通道存儲在同一個表Channels中,並將它們存儲到SubChannel表格按以下方式:ChannelId - SubChannelId。

所以,我需要得到這棵樹的通道與一個查詢 我試圖與此查詢做到這一點:

SELECT * FROM Channels 
EXCEPT 
SELECT Channels.Id, Channels.Title 
FROM Channels INNER JOIN SubChannels 
ON Channels.Id = SubChannels.SubchannelId 

但我無法正常工作。使用MSSQL它工作正常,但在我的SQLite出現問題。

您可以幫我解決這個問題,或者建議我一些其他的解決方案來將這個樹存儲在SQL中。

我的頻道類看起來是這樣的:提前

int Id 
string Title 
List<Channel> SubChannels 

感謝

回答

1

你能嘗試:

SELECT Id, Title 
    FROM Channels 
EXCEPT 
SELECT Channels.Id, Channels.Title 
    FROM Channels 
INNER JOIN SubChannels 
    ON Channels.Id = SubChannels.SubchannelId 

(即,不選擇*

甲方式來優化它:

SELECT Id, Title 
    FROM Channels 
WHERE Id NOT IN (
     SELECT DISTINCT SubchannelId 
     FROM SubChannels 
    ) 
+0

sqlite支持* – 2010-10-07 08:13:20

+0

是的,但我不確定它是否支持*中的EXCEPTING命名列,並且如果您的結構發展,僞造這樣的查詢是危險的。 – Benoit 2010-10-07 08:14:04

+0

謝謝,沒有選擇*它工作正常。非常感謝 – 2010-10-07 08:20:15

-1

SQLite不支持除

所以,你可以嘗試:

SELECT * FROM Channels c1 
WHERE NOT EXISTS(SELECT 1 
     SELECT Channels.Id, Channels.Title 
     FROM Channels c2 INNER JOIN SubChannels 
     ON Channels.Id = SubChannels.SubchannelId 
     WHERE c1.Id = c2.Id 
     AND c1.Title =c.Title) 
+0

[SQLite支持除外](http://www.sqlite.org/syntaxdiagrams.html#compound-operator )。 – Benoit 2010-10-07 08:07:59