2016-11-07 4 views
1

私は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から機能:

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 

しかし、この1の問題は、それがモジュール名が異なっていることを確認していないということで、結果は間違ってです:
enter image description here

それは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))

そしてdesierdを返します。結果は:
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 

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) 

答えて

0

にあなたはあなたが変更することができ,

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 
        ) 

andを交換する場合はあなたの条件は動作します:それは私の構文エラーを与える

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 
    ) ; 
+0

: "[近くに"、 ":構文エラー]" – E235

+0

@ E235構文 '(col1、col2)が(col1からcol2を選択していません)'が有効です。 – Kacper

+1

@ E235代替条件を追加しました – Kacper

関連する問題