【问题标题】:Get unique rows that appear in one table but not in other table by checking two columns通过检查两列获取出现在一个表中但不在另一表中的唯一行
【发布时间】:2016-11-07 19:46:27
【问题描述】:

我有三张桌子:
文件、模块和函数。

我有来自文件 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))

然后期望的结果将是:

代码:
表结构:

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 以将所有具有 same 模块的功能带给我 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)

【问题讨论】:

    标签: mysql sql sqlite


    【解决方案1】:

    如果您将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
          ) ;
    

    【讨论】:

    • 它给了我一个语法错误:" [ near ",": syntax error ]"。
    • @E235 语法(col1, col2) not in (select col1, col2 from x) 一般有效
    • @E235 我添加了替代条件
    • @Kacper “不存在”有效。我还找到了另一种方式,将其写在我的问题中的“编辑”下方。
    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 2020-08-07
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多