通过选中两列

时间:2016-11-07 19:46:27

标签: mysql sql sqlite

我有三张桌子:
文件,模块和功能。

我有来自文件mssip32.dll的函数和来自文件ncsi.dll的函数。

我想获取mssip32.dll中出现的所有函数,但是nsci.dll中的不是

重要:
如果名称或模块不同,功能会有所不同。

例如:

ModuleA.CreateProcess != ModuleB.CreateProcess (because they have different module)  

ModuleA.CreateProcess != ModuleA.Sleep         (because have different function name)  

ModuleA.CreateProcess == ModuleA.CreateProcess (equals)  

mssip32.dll和nsci.dll中的函数作为视图:

enter image description here

所有表格:
enter image description here

这就是我试图做的事情:

SELECT fu.function_name AS 'Imported Function', m.module_name AS 'Library', COUNT(fu.function_name) AS 'Usage Count'
                                FROM File as f,
                                     Module as m,
                                     Function as fu
                                WHERE f.listview_name like 'listView1'
                                AND f.file_id = m.file_id
                                AND f.file_id = fu.file_id
                                AND m.module_id = fu.module_id
                                AND fu.function_name NOT in (
                                                    SELECT fu2.function_name
                                                    FROM File as f2,
                                                         Module as m2,
                                                         Function as fu2
                                                    WHERE f2.listview_name like 'listView2'
                                                    AND f2.file_id = m2.file_id
                                                    AND f2.file_id = fu2.file_id
                                                    AND m2.module_id = fu2.module_id
                                                    )
                                GROUP BY fu.function_name
                                ORDER BY COUNT(fu.function_name) DESC

但问题是,它没有检查模块名称是否不同,结果是不正确
enter image description here

我们缺少ModuleA.CreateProcess,因为它没有出现在' listView2'中。

我希望能够尝试这样的事情(理论上):

...
AND (fu.function_name AND m.module_name) NOT in (
                    SELECT fu2.function_name, m2.module_name
                    FROM File as f2,
                         Module as m2,
                         Function as fu2
                    WHERE f2.listview_name like 'listView2'
                    AND f2.file_id = m2.file_id
                    AND f2.file_id = fu2.file_id
                    AND m2.module_id = fu2.module_id
                    )
...

所以,如果我有:

fu.function_name = "CreateProcess"  
m.module_name    = "ModuleA"  

fu2.function_name = "CreateProcess"  
m2.module_name    = "ModuleB"  

它将返回((fu.function_name != fu2.function_name) OR (m.module_name != m2.module_name))

然后 desierd result 将是:
enter image description here

CODE:
表格结构:

CREATE TABLE File (
    file_id INTEGER NOT NULL ,
    name VARCHAR(160) NOT NULL ,
    listview_name VARCHAR(30) NOT NULL ,
    type VARCHAR(10) NOT NULL ,
    recursive VARCHAR(10) NOT NULL ,
    PRIMARY KEY (file_id)
) ;

CREATE TABLE Module (
    file_id INTEGER NOT NULL ,
    module_id INTEGER NOT NULL ,
    module_name VARCHAR(30) NOT NULL ,
    PRIMARY KEY (file_id)
) ;

CREATE TABLE Function (
    file_id INTEGER NOT NULL ,
    module_id INTEGER NOT NULL ,
    function_name VARCHAR(30) NOT NULL ,
    PRIMARY KEY (file_id)
) ;

观看结构:

CREATE VIEW function_List1 AS
    SELECT fu.function_name, m.module_name
    FROM File as f,
         Module as m,
         Function as fu
    WHERE f.listview_name like 'listView1'
    AND f.file_id = m.file_id
    AND f.file_id = fu.file_id
    AND m.module_id = fu.module_id

CREATE VIEW function_List2 AS
    SELECT fu2.function_name, m2.module_name
    FROM File as f2,
         Module as m2,
         Function as fu2
         WHERE f2.listview_name like 'listView2'
         AND f2.file_id = m2.file_id
         AND f2.file_id = fu2.file_id
         AND m2.module_id = fu2.module_id

修改
我找到了解决它的另一种方法 我可以查询listview2,用listview1中的函数带来相同模块的所有函数,然后检查listview1中的函数是否在该列表中。
我是通过添加AND m.module_name = m2.module_name

来完成的
AND fu.function_name NOT in (
SELECT fu2.function_name
FROM File as f2,
     Module as m2,
     Function as fu2
WHERE f2.listview_name like 'listView2'
AND f2.file_id = m2.file_id
AND f2.file_id = fu2.file_id
AND m2.module_id = fu2.module_id
AND m.module_name = m2.module_name)

1 个答案:

答案 0 :(得分:0)

如果您将and替换为,

,则您的情况会有效
AND (fu.function_name, m.module_name) NOT in (
                    SELECT fu2.function_name, m2.module_name
                    FROM File as f2,
                         Module as m2,
                         Function as fu2
                    WHERE f2.listview_name like 'listView2'
                    AND f2.file_id = m2.file_id
                    AND f2.file_id = fu2.file_id
                    AND m2.module_id = fu2.module_id
                    )

您可以更改为:

WHERE NOT EXISTS 
      ( SELECT 1
        FROM File as f2,
                             Module as m2,
                             Function as fu2
                        WHERE f2.listview_name like 'listView2'
                        AND f2.file_id = m2.file_id
                        AND f2.file_id = fu2.file_id
                        AND m2.module_id = fu2.module_id
                        AND fu2.function_name = fu.function_name
                        AND m.module_name = m2.module_name
      ) ;