使用3个表

时间:2018-01-31 18:46:09

标签: sql postgresql

我有三个表:A,B和C,如下:

表A

  • ID(int)[PK]
  • KeyFromTableA(varchar)

表B

  • ID(int)[PK]
  • 名称(varchar)

表C

  • Table_A_ID(int)[PK] [FK]
  • Table_B_ID(int)[PK] [FK]
  • ValueFromTableC(int)
  • AnotherValueFromTableC(int)

我想构建一个查询,通过查询特定的表B ID,返回表A的所有可能ID:

  • 如果至少有一行包含表A ID且查询表B ID,我想执行操作ValueFromTableC - AnotherValueFromTableC。如果此操作为肯定,则当前的表A ID有效且应由查询返回,
  • 如果,并且只有IF,在一行中找不到表A 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执行肯定检查时失败。因此不得返回。
  • 表C 上没有数据引用表A Table_B_ID = 4.但仍然必须执行第二个条件,并且它失败,因为ID是假的。所以不应该退货。
  • 最后,还没有关于表A KeyFromTableA = 5的数据。第二个条件也会应用,因为ID为真,所以它会通过。所以5也应该包含在查询结果中。

我有这个问题,但我无法确定它为什么不起作用。

KeyFromTableA

2 个答案:

答案 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'