Postgres sql查询难以加入

时间:2012-09-14 00:09:19

标签: postgresql tuples

以下是我的表格:

Table A which has entries with "item" and "grade" fields
Table B which has entries with A.id
Tuple table B-C

我希望所有A条目都有item =" x"和年级=" y" 并且与B条目相关联的所有C条目与具有item =" x"的A条目相关联。和年级=" y"

例如

A table:

    A.item = "x", A.Grade = "y", A.id = 1
    A.item = "x", A.Grade = "y", A.id = 2
    A.item = "x", A.Grade = "y", A.id = 3
    A.item = "r", A.Grade = "z", A.id = 4

B Table

   B.AID = 1, B.id = 10
   B.AID = 1, B.id = 11
   B.AID = 2, B.id = 13
   B.AID = 3, B.id = 14
   B.AID = 4, B.id = 15

B-C Tuple Table

   BID = 10, CID = 20
   BID = 11, CID = 20
   BID = 13, CID = 20
   BID = 15, CID = 21

查询应返回A表中的所有条目和条目20,但不返回C表中的21,因为C.id = 21仅与B关联,而B与不符合项目的A相关联等级要求。

1 个答案:

答案 0 :(得分:0)

这些关联虽然听起来很复杂,但只是三个表中的简单连接:a加入b加入c

您可以确定需要如何连接列:"与A条目相关联的B条目",并查看列,您希望加入b.aid = a.id。同样适用于bc

SELECT ...
FROM
    a
    JOIN b ON b.aid = a.id
    JOIN b_c ON b_c.bid = b.id
WHERE
    ...

这会在将原始数据集拆分为三个规范化表之前构造它。

下一步是按给定条件过滤。你只想要行" item =" x"和grade =" y"",所以将这些添加到WHERE子句前面加上表名,在这种情况下这是可选的):

WHERE
    a.item = 'x'
    AND a.grade = 'y'

最后,您可以在SELECT子句中选择您真正需要的列。我会盯着SELECT b_c.cid做。虽然如果你也有一个c表,你也可以加入该表,并从中选择列。

相关问题