好的。所以这很难解释,但我正在替换数据库中外键的类型。为此,我需要更新引用它的表中的值。这一切都很好,很好,很容易做到。
我将这些东西插入到一个临时表中,该表将替换原始表,但insert
查询一点也不难,这select
是我从中获取值的地方。
但是,我还想保留原始引用为 NULL 的任何条目。也不难,我可以为此使用左内连接。
但我们还没有完成:我不想要第二个表中没有匹配项的条目。我已经在这个问题上闲逛了 2 个小时了,而且我对这个问题的了解并不比我对月球的了解更近。
让我给你一个示例数据集:
____________________________
| Inventory || Customer |
|============||============|
| ID Cust || ID Name |
|------------||------------|
| 1 A || 1 A |
| 2 B || 2 B |
| 3 E || 3 C |
| 4 NULL || 4 D |
|____________||____________|
假设数据库使用该Customer.Name
字段作为其主键,我需要将其更改为标准int identity(1,1) not null
ID。我在客户表中添加了没有问题的字段,并保留了名称,因为我需要它用于其他内容。在所有不允许 NULL 的表中,我对此没有任何问题,但是由于“库存”表允许将某些内容与无客户相关联,所以我遇到了麻烦。
如果我做了一个左内连接,我的结果将是:
______________
| Results |
|============|
| ID Cust |
|------------|
| 1 1 |
| 2 2 |
| 3 NULL |
| 4 NULL |
|____________|
但是,Inventory #3 引用了一个不存在的客户。我希望将其过滤掉。这个数据库是我的开发数据库,我在其中肆意无视有效性来破解、削减和破坏事物。所以这些表中的很多链接不再有效。下一步是在不应该存在不良记录的 beta 测试环境中复制此过程,但我不能保证。因此,如果可能的话,我想保留过滤器。
我现在的查询是使用子查询来查找所有存在于或中Inventory
的行。然后它尝试仅从子查询找到的那些行中获取值。这是翻译后的查询:CustID
Customers
is null
insert into results
(
ID,
Cust
)
select
inv.ID, cust.ID
from Inventory inv, Customer cust
where inv.ID in
(
select inv.ID from Inventory inv, Customer cust
where inv.Cust is null
or cust.Name = inv.Cust
)
and cust.Name = inv.Cust
但是,我相信您可以看到,这个查询是不正确的。我试过使用 2、3 个子查询、内连接、左连接、bleh。这个查询的结果,以及我尝试过的许多其他查询(这不是可怕的、可怕的错误)是:
______________
| Results |
|============|
| ID Cust |
|------------|
| 1 1 |
| 2 2 |
|____________|
这本质上是一个内部连接。考虑到我的实际数据有大约 1100 条在该字段中具有 NULL 值的记录,我认为截断它们不是答案。
我正在寻找的答案是:
______________
| Results |
|============|
| ID Cust |
|------------|
| 1 1 |
| 2 2 |
| 4 NULL |
|____________|
插入到 select 中最棘手的部分是,我希望插入另一个表中的值,或者本质上是该表中的值或文字 NULL。那只是我不知道该怎么做。我仍然掌握 SQL 的窍门。
由于我将此查询的结果插入到表中,因此我考虑使用 select 进行插入,该选择省略了 NULL 值和不匹配的记录,然后返回并添加所有 NULL 记录,但我真的很想学习如何做这样的更高级的查询。
那么你们中的任何人有什么想法吗?因为我迷路了。