我有三张桌子:
文件,模块和功能。
我有来自文件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中的函数作为视图:
这就是我试图做的事情:
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
我们缺少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))
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)
答案 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
) ;