循环检查从一张桌子到另一张桌子的情况
问题描述:
我有两张牌子和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
只有匹配的记录将被检索。