1

好的。所以这很难解释,但我正在替换数据库中外键的类型。为此,我需要更新引用它的表中的值。这一切都很好,很好,很容易做到。

我将这些东西插入到一个临时表中,该表将替换原始表,但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 nullID。我在客户表中添加了没有问题的字段,并保留了名称,因为我需要它用于其他内容。在所有不允许 NULL 的表中,我对此没有任何问题,但是由于“库存”表允许将某些内容与无客户相关联,所以我遇到了麻烦。
如果我做了一个左内连接,我的结果将是:

______________
|   Results  |
|============|
| ID   Cust  |
|------------|
|  1     1   |
|  2     2   |
|  3   NULL  |
|  4   NULL  |
|____________|

但是,Inventory #3 引用了一个不存在的客户。我希望将其过滤掉。这个数据库是我的开发数据库,​​我在其中肆意无视有效性来破解、削减和破坏事物。所以这些表中的很多链接不再有效。下一步是在不应该存在不良记录的 beta 测试环境中复制此过程,但我不能保证。因此,如果可能的话,我想保留过滤器。

我现在的查询是使用子查询来查找所有存在于或中Inventory的行。然后它尝试仅从子查询找到的那些行中获取值。这是翻译后的查询:CustIDCustomersis 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 记录,但我真的很想学习如何做这样的更高级的查询。

那么你们中的任何人有什么想法吗?因为我迷路了。

4

1 回答 1

1

工会怎么样?

选择 ID 和 Cust 匹配的所有记录,并将其与 ID 匹配且inventory.cust 为空的所有记录合并。

于 2013-05-14T22:42:46.930 回答