首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用WHERE不存在(从表中选择TOP 1 (id),其中aaa类似于@aaa,并且不返回不存在和不存在的结果

使用WHERE不存在(从表中选择TOP 1 (id),其中aaa类似于@aaa,并且不返回不存在和不存在的结果
EN

Stack Overflow用户
提问于 2020-01-12 21:09:44
回答 1查看 103关注 0票数 0

我使用一个C#程序将CSV数据传输到数据库中。我正在使用下面的SQL字符串,以确保不将双变量输入数据库。

代码语言:javascript
运行
复制
"INSERT INTO Transacties (DebetRekening, CreditRekening, Datum, Bedrag, VolgNummer, Munt, Code, Betalingskenmerk, Omschrijving)
    SELECT 
        @DebetRekening, @CreditRekening, @Datum, @Bedrag, @VolgNummer, 
        @Munt, @Code, @Betalingskenmerk, @Omschrijving
    WHERE NOT EXISTS (SELECT TOP 1(TransactieID)
                      FROM Transacties
                      WHERE DebetRekening LIKE @DebetRekening
                        AND CreditRekening LIKE @CreditRekening
                        AND Datum LIKE @Datum
                        AND Bedrag LIKE @Bedrag
                        AND VolgNummer LIKE @VolgNummer
                        AND Munt LIKE @Munt
                        AND Code LIKE @Code 
                        AND Betalingskenmerk LIKE @Betalingskenmerk 
                        AND Omschrijving LIKE @Omschrijving)"

在这里添加了换行以使其可读性,它是程序中的一行。

这里我包括一条记录,除非我能在数据库中找到这条记录。

即使当我知道我试图输入的记录在数据库中时,SQL仍然找不到它,只输入一个double。

如果我省略了如下所有和声明:

代码语言:javascript
运行
复制
"INSERT INTO Transacties
(DebetRekening, CreditRekening, Datum, Bedrag, VolgNummer, Munt, Code, Betalingskenmerk, Omschrijving)
SELECT @DebetRekening, @CreditRekening, @Datum, @Bedrag, @VolgNummer, @Munt, @Code, @Betalingskenmerk, @Omschrijving
WHERE NOT EXISTS
(
SELECT TOP 1(TransactieID)
FROM Transacties
WHERE
DebetRekening LIKE @DebetRekening
)"

它找到现有的记录,并且不会双倍地输入它。

不管我使用的是哪个参数,只要只有一个参数。一旦我输入一个和检查另一个字段,它就找不到任何记录了。

我在这里错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-12 21:17:29

问题可能在于NULL值。如果任何一个值都是Datum LIKE @Datum,则像NULL这样的条件不会得到满足。

您需要检查这两个值是相等的还是都是null:这是空安全相等的概念(例如,SQLServer没有内置这个概念,不像MySQL )。

代码语言:javascript
运行
复制
INSERT INTO Transacties(...)
SELECT ...
WHERE NOT EXISTS
(
    SELECT 1
    FROM Transacties
    WHERE
        (DebetRekening IS NULL AND @DebetRekening IS NULL OR DebetRekening = @DebetRekening)
        AND (CreditRekening IS NUL AND @CreditRekening IS NULL OR CreditRekening = @CreditRekening)
        AND ...
)

备注:

  • --您在EXISTS子查询中不需要SELECT TOP 1EXISTS构造是用来检查是否存在某种东西的,并且数据库基本上会立即丢弃结果。convention
  • a LIKE b是一个广泛使用的accordingly
  • depending,相当于a = b (因为右操作数没有使用通配符):我简化了数据库上的代码accordingly
  • depending,可能存在更好的选项。例如,MySQL有ON DUPLICATE KEYS,Postgres有ON DUPLICATE KEYS
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59708143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档