私は3つのテーブルを持っています:
ファイル、モジュール、2つの列をチェックして1つのテーブルに表示され、他のテーブルには表示されないユニークな行を取得
私はファイル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
しかし、この1の問題は、それがモジュール名が異なっていることを確認していないということで、結果は間違ってです:
それはdoesnのため、私たちは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
EDIT:
が、私はそれを解決する別の方法を発見しました。
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)
: "[近くに"、 ":構文エラー]" – E235
@ E235構文 '(col1、col2)が(col1からcol2を選択していません)'が有効です。 – Kacper
@ E235代替条件を追加しました – Kacper