我有一个包含更多表的数据库,我必须检查所选表的名称是否为其他表。
例如,假设我们的数据库包含4个表(称为Laptop1,Laptop2,Laptop3和Laptop4),并且每个表都定义了一个笔记本电脑。因此它包含名称,日期,模型。我可以选择表Laptop1,并且必须检查Laptop2,Laptop3或Laptop4中是否不存在Laptop1.name。
我正在使用SQL,该应用程序是用C#编写的。
提前谢谢!
答案 0 :(得分:0)
您可以使用not exists
:
select l1.*
from laptop1 l1
where
not exists (select 1 from laptop2 l2 where l2.name = l1.name)
and not exists (select 1 from laptop3 l3 where l3.name = l2.name)
and not exists (select 1 from laptop4 l4 where l4.name = l2.name)
答案 1 :(得分:0)
您确实可以使用不存在。 但是我同意Zohar Peled的观点:体系结构似乎并不相关。您应该将所有笔记本电脑放在同一张桌子上。 别忘了检查不存在会特别花费很多IO,如果使用varchar。 如果您仍然这样: -检查您的索引。您可能在两个表的名称列上都需要一个索引 -由于执行计划会改变,即使结果相同,有时在内部版本的sql server中使用内部联接也会更有效。它将返回仅存在于4个表中的结果:
select id from laptop1 l1 Inner join laptop2 l2 on l1.name = l2.name Inner join...
->如果在一个表中找不到名称,则为null。
但是,这根本不会表现出色,如果可以的话,您应该查看架构师
答案 2 :(得分:0)
对于真实的数据库,您应该进行修复。除非如此,否则我建议在数据库中创建一个视图:
create view v_laptops as
select name, date, model, 1 as which from laptop1 union all
select name, date, model, 2 from laptop2 union all
select name, date, model, 3 from laptop3 union all
select name, date, model, 4 from laptop4;
然后在查询中使用该视图:
select ot.*, l.*
from othertable ot join
v_laptops l
on ot.name = l.name;
您可能想与数据库管理员讨论有关修复数据模型的问题。在多个表之间拆分信息通常不是一个好主意。
您真的不想处理一堆不同的表和在多个查询中引用的类似代码。这似乎是一场维护噩梦。视图可以帮助将此类设计问题与用户隔离。
答案 3 :(得分:0)
您可以使用EXCEPT子句获取其他表中不存在的笔记本电脑名称。
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.12.0/umd/react-dom.development.js"></script>
理想情况下,您不应有多个包含笔记本电脑信息的表。在关系模型中,“笔记本电脑”是一组包含笔记本电脑的集合。您可以使用称为主键的唯一键来区分笔记本电脑。首先定义一个笔记本电脑表并加载唯一的数据。该表现在包含唯一的笔记本电脑信息
SELECT Name FROM Laptop1
EXCEPT
(
SELECT Name FROM Laptop2
UNION ALL
SELECT Name FROM Laptop3
UNION ALL
SELECT Name FROM Laptop4)