我一直在开发一个数据库,其中的表如下所示:
Customer
id INTEGER, PRIMARY KEY
name VARCHAR
Entrance
id INTEGER, PRIMARY KEY
desc VARCHAR
CustomerEntranceRestriction
idEntrance PK, FK to Entrance.id
idCustomer PK, FK to Customer.id
这个 CustomerEntranceRestriction
表中只包含客户只能使用的入口的条目。此表中没有记录的客户可以访问任何入口。
我想试着把每个顾客都能进入的所有入口都退回去。我的问题如下:
SELECT DISTINCT
c.id As customer_id,
e.id AS entrance_id
FROM customer c
JOIN entrance e
LEFT JOIN CustomerEntranceRestriction cer1
ON cer1.idCustomer = cu.id
LEFT JOIN CustomerEntranceRestriction cer2
ON cer2.idEntrance = e.id
WHERE
IF(cer1.idCustomer IS NULL, 0, cer2.idEntrance - e.id) = 0
AND
IF(cer2.idEntrance IS NOT NULL,IF(cer2.idCustomer =cu.idCustomer,0,1),0) = 0
我认为这样做是对的,但我对逻辑的把握不够。左连接到 CustomerEntranceRestriction
表中的两个部分主键,我们可以包含 NULL
两个匹配项的值。匹配发生在 cer1
或者 cer2
我们检查是否有匹配的 c.id
或者 e.id
,删除失败的行。
这是合理的逻辑吗?我不确定它在关系数据库中是否有名称。
另一种方法是采取交叉连接的所有 Customer
以及 Entrance
中没有客户的记录 CustomerEntranceRestrction
以及 UNION
那些记录在 CustomerEntranceRestriction
table。
如有任何建议,将不胜感激。
2条答案
按热度按时间klh5stk11#
通过使用适当的where和and可以避免if条件
eeq64g8w2#
我想你想要:
这从顾客和入口的所有组合开始。它带来了任何限制。
这个
WHERE
条款的意思是:(1)客户没有限制,或者(2)允许客户进入。