我有三个表:A,B和C,如下:
表A
表B
表C
我想构建一个查询,通过查询特定的表B ID,返回表A的所有可能ID:
ID
且查询表B ID
,我想执行操作ValueFromTableC
- AnotherValueFromTableC
。如果此操作为肯定,则当前的表A ID
有效且应由查询返回,ID
或表B ID
,我想要查看表A KeyFromTableA
。如果此列为true,则表A ID也有效,应由查询返回。实施例
表A
ID | KeyFromTableA
01 | false
02 | true
03 | false
04 | false
05 | true
表B
ID | Name
1 | A
2 | B
3 | C
表C
Table_A_ID | Table_B_ID | ValueFromTableC | AnotherValueFromTableC
1 | 1 | 5 | 3
1 | 2 | 3 | 6
2 | 2 | 4 | 5
3 | 1 | 0 | 1
如果我按Table_B_ID
= 1查询,则应返回Table_A_ID
的1,2和5,因为(所有排序和命名都与表C相关):
Table_B_ID
= 1,因此匹配。我执行操作5 - 3并且是积极的。因此Table_A_ID
= 1有效。Table_B_ID
= 1与Table_A_ID
= 2相关,但由于在表A 中,ID
= 2的行具有{{1使用 true 值,KeyFromTableA
= 2也有效。Table_A_ID
= 3与Table_A_ID
= 1相关,但在0 - 1执行肯定检查时失败。因此不得返回。Table_B_ID
= 4.但仍然必须执行第二个条件,并且它失败,因为ID
是假的。所以不应该退货。KeyFromTableA
= 5的数据。第二个条件也会应用,因为ID
为真,所以它会通过。所以5也应该包含在查询结果中。我有这个问题,但我无法确定它为什么不起作用。
KeyFromTableA
答案 0 :(得分:1)
我不这么认为所以我们需要在这种情况下使用表b,因为我们只需要表a中的id。试试这个:
select a.id from a
where exists (select 1 from c where Table_B_ID = id_value(2)
and table_a_id = a.id and c.ValueFromTableC > c.AnotherValueFromTableC)
or not exists (select 1 from c where Table_B_ID = id_value(1)
and table_a_id = a.id) and a.KeyFromTableA;
答案 1 :(得分:1)
我认为一个简单的UNION
就足够了。
SELECT id_a
FROM table_c
WHERE id_b = 1
AND col_c_1 - col_c_2 > 0
UNION
SELECT table_a.id
FROM table_a
LEFT OUTER JOIN table_c ON (table_a.id = table_c.id_a AND table_c.id_b = 1)
WHERE table_c.id_a IS NULL AND table_a.key_a = 'true'