【问题标题】:Help Building SQL query帮助构建 SQL 查询
【发布时间】:2010-10-07 07:58:57
【问题描述】:

我有以下 2 张桌子

Channels:
Id int PK
Title varchar

SubChannels:
ChannelId int
SubchannelId int

当我从服务接收数据时,我试图将其保存到 SQL。我收到了几个 Channel 实例,所以我将它存储在 Channels 表中,之后我试图持久化每个子通道(每个通道都包含子通道列表),所以,我将子通道存储在同一个表 Channels 中,并将它们的 Id 存储到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

提前致谢

【问题讨论】:

    标签: sql sqlite


    【解决方案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
        )
    

    【讨论】:

    • 是的,但我不确定它是否支持 EXCEPTING 来自 * 的命名列,如果您的结构不断发展,伪造这样的查询是危险的。
    • 我不知道 SQLite,但是在谷歌搜索后我得到了这个:“微软在 SQL Server 2005 中引入了 EXCEPT 运算符,它从左侧返回所有不同的(!)行EXCEPT 运算符。它还会从结果集中删除与 EXCEPT 运算符右侧的行匹配的所有行。所以我会按照你在第二种方法中的方式编写它,但我会在第一行添加一个“distinct”,比如“SELECT DISTINCT Id, Title ...”
    【解决方案2】:

    SQLite 不支持 EXCEPT

    所以你可以试试:

    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)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多