C# Sql查询以查找歌曲表中没有歌曲的唱片集记录

C# Sql查询以查找歌曲表中没有歌曲的唱片集记录,c#,sql,sqlite,C#,Sql,Sqlite,我正在使用一个C语言的sqlite数据库,需要一个sql查询的帮助,我不知道我试图在单次查询中得到的是否可能我目前的解决方案效率很低,很差,我已经把它放在了最后,但首先我的问题 我有两张表格,分别是歌曲和专辑,表格如下所示 我需要写一个查询来获取所有在歌曲表中没有歌曲的专辑记录 Songs Artist Album Filename Taylor Swift Red track1.mp3

我正在使用一个C语言的sqlite数据库,需要一个sql查询的帮助,我不知道我试图在单次查询中得到的是否可能我目前的解决方案效率很低,很差,我已经把它放在了最后,但首先我的问题

我有两张表格,分别是歌曲和专辑,表格如下所示

我需要写一个查询来获取所有在歌曲表中没有歌曲的专辑记录

    Songs

    Artist           Album         Filename        
    Taylor Swift     Red           track1.mp3      
    Taylor Swift     Red           track2.mp3      
    Taylor Swift     Fearless      track1.mp3      
    Taylor Swift     Fearless      track2.mp3    
    Shakira          GrandesExitos track1.mp3


    Albums

    Artist           Album 
    Taylor Swift     Red    
    Taylor Swift     Fearless  
    Taylor Swift     Beautiful Eyes  
    Shakira          The remixes
    Jackson          Fearless
    Taylor Swift     The remixes
需要歌曲表中没有歌曲的专辑的所有记录

    So in this case the records of Album I need are

    Taylor Swift     Beautiful Eyes  
    Shakira          The remixes
    Jackson          Fearless
    Taylor Swift     The remixes
我目前的解决方案效率很低,如下所示,我只需要查询方面的帮助,不需要C代码

    dt = db.GetDataTable(String.Format("select distinct artist, album from files");

    foreach (DataRow r in dt.Rows)
    {
       string artist = (string)r[0];
       string album = (string)r[1];
       //I have create a status column in the Albums table to solve this problem
       query = string.Format("update Albums set status = {0} where artist = '{1}' and album = '{2}'", 1, artist, album);

       int nModified = db.ExecuteNonQuery(query);
     }
     // Then I get all records from Albums whose status is not 1
      dt = db.GetDataTable(select * from Albums where status = 0");

     }
您可以使用SQL语句EXISTS检查特定唱片集是否不存在歌曲:

SELECT alb.Artist, alb.Album
FROM Albums alb
WHERE NOT EXISTS (
    SELECT 1 
    FROM Songs s 
    WHERE s.Artist = alb.Artist AND s.Album = alb.Album
)
此SQL语句返回table Album中的所有记录,这些记录在table Songs中没有相关记录。

您可以尝试此操作

Select * from albums where album not in(select album from songs)

别忘了加入

select
    album.Artist, album.Album
from
    Albums album
    left outer join Songs song
        on album.Artist = song.Artist and album.Album = song.Album
where
    song.Filename is null -- if it's valid for some reason to have a null song name, just change this to song.Artist is null

这样您就不需要嵌套查询。

选择1?你是说在潜艇里选择*query@Ahmed不,我是说1。如果选择*、1或其他任何内容都无关紧要,主要的一点是,如果子查询返回任何记录,则不管列是什么,否则返回true,否则返回false。所以我选择常量值1,而不是选择所有列。很可能大多数SQL引擎都以相同的方式优化查询,我在本例中只选择了1。这是不正确的,Album没有唯一地标识任何一个表中的行,最终结果可能有来自不同艺术家的Album记录。这是不正确的,Album没有唯一地标识任何一个表中的行,最终的结果可能是来自另一位艺术家的唱片。如果你打算否决一项解决方案,请体面地给出解释。
select
    album.Artist, album.Album
from
    Albums album
    left outer join Songs song
        on album.Artist = song.Artist and album.Album = song.Album
where
    song.Filename is null -- if it's valid for some reason to have a null song name, just change this to song.Artist is null