【发布时间】:2015-07-22 17:24:19
【问题描述】:
我有两张桌子:
-
T1是一个数据表- 列
one不能有null - 列
two和three可以有nulls
- 列
-
T2是分类规则表- 它具有与
T1相同的列以及一个代表类别的cat列 - 这个想法是,前三列具有用于确定
T1中的行如何以及是否应该分类的标准 -
T2中的一行可能有 2 列以上的值,这意味着T1中需要匹配多个条件(例如T1.two like "2*" and T1.three like "hi")
- 它具有与
我想要一个查询来查找T1 中根据T2 中的条件匹配的行。这是一个例子:
+------+------+-------+
| T1 |
+------+------+-------+
| one | two | three |
+------+------+-------+
| aaaa | 1111 | |
| bbbb | 2222 | |
| cccc | | test |
| dddd | | |
+------+------+-------+
+------+-----+-------+------+
| T2 |
+------+-----+-------+------+
| one | two | three | cat |
+------+-----+-------+------+
| aaaa | * | * | 1 | -> all rows in T1 where column one equals aaaa
| * | 2* | * | 2 | -> all rows in T1 where column two starts with 2
| * | * | test | 3 | -> all rows in T1 where column three equals test
| * | 3* | hi | 3 | -> all rows in T1 where column two starts with 3 AND column 3 equals hi
+------+-----+-------+------+
我在T2 中有*,因为我想说这些列中的值无关紧要。所以以第二行为例,我说的是匹配 T1 中的所有行,其中:
-
one什么都可以 -
two以 2 开头 -
three什么都可以
我的想法是做一个模棱两可的连接并过滤匹配的行:
SELECT T1.one, T2.one, T1.two, T2.two, T1.three, T2.three, T2.id
FROM T1, T2
WHERE
(T1.one Like [T2].[one]) ' match column one
AND (T1.two Is Null Or T1.two Like [T2].[two]) ' match column two; the "is null" is needed in case the value is not there in T1
AND (T1.three Is Null Or T1.three Like [T2].[three]) ' match column three; the "is null" is needed in case the value is not there in T1
结果如下表。它部分有效,但返回不应该的行(标记如下)。
+--------+--------+--------+--------+----------+----------+----+
| Result |
+--------+--------+--------+--------+----------+----------+----+
| T1.one | T2.one | T1.two | T2.two | T1.three | T2.three | cat|
+--------+--------+--------+--------+----------+----------+----+
| aaaa | aaaa | 1111 | * | | * | 1 |
| aaaa | * | 1111 | * | | test | 3 | -> THIS SHOULD NOT BE RETURNED
| bbbb | * | 2222 | 2* | | * | 2 |
| bbbb | * | 2222 | * | | test | 3 | -> THIS SHOULD NOT BE RETURNED
| cccc | * | | 2* | test | * | 2 | -> THIS SHOULD NOT BE RETURNED
| cccc | * | | * | test | test | 3 |
| dddd | * | | 2* | | * | 2 | -> THIS SHOULD NOT BE RETURNED
| dddd | * | | * | | test | 3 | -> THIS SHOULD NOT BE RETURNED
+--------+--------+--------+--------+----------+----------+----+
我已经开始了几个小时,但我不知道如何做我需要的。
我认为这不是一个特定于数据库的问题,但如果它很重要,我会尝试使用 MS Access 2013 来解决这个问题。
【问题讨论】:
-
我无法理解您想要什么...您能进一步解释一下吗?您想要 T1 中的行,其中 T2 中的等效字段为空或等于 T1?
-
你的表中真的有星号吗?
-
你应该在 WHERE 子句中使用 OR 而不是 AND
-
@PatB:我添加了更多细节。我希望它有所帮助。
-
@Gene:是的,因为我想说这些列中的值不重要。
标签: sql ms-access ms-access-2013