循环检查从一张桌子到另一张桌子的情况

循环检查从一张桌子到另一张桌子的情况

问题描述:

我有两张牌子和generic_Drugs。一个generic_Drugs模型可以有许多品牌模型。因此,generic_Drugs ID存储在品牌模型中。然而,当仿制药被删除时,它的ID仍然存在于品牌模型中 - 这就是我的应用程序根据用户要求而行为的方式。循环检查从一张桌子到另一张桌子的情况

我需要一种技术,从数据库检索品牌项目,它只检索generic_drug ID存在于generic_drug类表中的品牌项目。

例子:

品牌模型 - 品牌表

+--------+-----------+ 
    | id  |Generic id |  
    +--------+-----------+ 
    |  1 | 2001  | 
    |  2 | 2001  | 
    |  3 | 2002  | 
    |  4 | 2003  | 
    |  5 | 2004  | 
    |  6 | 2004  | 
    |  7 | 2005  | 
    |  8 | 2006  | 
    |  9 | 2006  | 
    +--------+-----------+ 

Generic_Drugs - genericDrugs表

+-----------+ 
    | id  |  
    +-----------+ 
    | 2001  | 
    | 2002  | 
    | 2003  | 
    | 2005  | 
    +-----------+ 

所以我需要一种技术来列出从品牌使用的所有品牌项目,其中在应用条件品牌表中的generic_drug id,并仅列出generic_drugs表中存在其通用标识的品牌:

因此,当我运行查询应该只检索:

+--------+-----------+ 
    | id  |Generic id |  
    +--------+-----------+ 
    |  1 | 2001  | 
    |  2 | 2001  | 
    |  3 | 2002  | 
    |  4 | 2003  | 
    |  5 | 2004  | 
    |  7 | 2005  | 
    +--------+-----------+ 

您可以通过两种方式实现相同。一种是通过使用INNER JOIN

SELECT Id 
FROM Brand b 
INNER JOIN generic_Drugs gd ON gd.id=b.`Generic id` 

OR

而另一种是通过使用EXISTS

SELECT Id 
FROM Brand b 
WHERE EXISTS(SELECT 1 
       FROM generic_Drugs 
       WHERE b.`Generic id`=id) 

如果没有仿制药可以不存在的品牌,那么我会建议在删除通用药物时删除相应的品牌。因此,您不必在选择查询中进行调整。您可以添加品牌表的Generic id作为FK,然后删除相应的品牌记录。

我们只需使用一个INNER JOIN。

SELECT DISTINCT(b.id) 
FROM brands b INNER JOIN genericDrugs gd 
ON b.`Generic id` = gd.id 

只有匹配的记录将被检索。