2010-10-07 2 views
1

У меня после 2 таблицыПомощь Строительство SQL-запрос

Channels: 
Id int PK 
Title varchar 

SubChannels: 
ChannelId int 
SubchannelId int 

Когда я получаю данные из службы я пытаюсь упорствовать его SQL. Я получаю несколько экземпляров канала, поэтому я храню их в таблице 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 поддерживает * –

+0

Да, но я не уверен, что он поддерживает ИСКЛЮЧЕНИЕ названных столбцов из *, и подделка такого запроса опасна, если ваша структура эволюционирует. – Benoit

+0

спасибо, без выбора * он отлично работает. Большое спасибо –

-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

Смежные вопросы