Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kapan menggunakan KECUALI sebagai lawan NOT EXISTS di Transact SQL?

EXCEPT memperlakukan NULL nilai sebagai pencocokan.

Kueri ini:

WITH    q (value) AS
        (
        SELECT  NULL
        UNION ALL
        SELECT  1
        ),
        p (value) AS
        (
        SELECT  NULL
        UNION ALL
        SELECT  2
        )
SELECT  *
FROM    q
WHERE   value NOT IN
        (
        SELECT  value
        FROM    p
        )

akan mengembalikan rowset kosong.

Kueri ini:

WITH    q (value) AS
        (
        SELECT  NULL
        UNION ALL
        SELECT  1
        ),
        p (value) AS
        (
        SELECT  NULL
        UNION ALL
        SELECT  2
        )
SELECT  *
FROM    q
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    p
        WHERE   p.value = q.value
        )

akan kembali

NULL
1

, dan yang ini:

WITH    q (value) AS
        (
        SELECT  NULL
        UNION ALL
        SELECT  1
        ),
        p (value) AS
        (
        SELECT  NULL
        UNION ALL
        SELECT  2
        )
SELECT  *
FROM    q
EXCEPT
SELECT  *
FROM    p

akan kembali:

1

Referensi rekursif juga diperbolehkan di EXCEPT klausa dalam CTE rekursif , meskipun berperilaku aneh:ia mengembalikan semuanya kecuali baris terakhir dari set sebelumnya, tidak semuanya kecuali seluruh set sebelumnya:

WITH    q (value) AS
        (
        SELECT  1
        UNION ALL
        SELECT  2
        UNION ALL
        SELECT  3
        ),
        rec (value) AS
        (
        SELECT  value
        FROM    q
        UNION ALL
        SELECT  *
        FROM    (
                SELECT  value
                FROM    q
                EXCEPT
                SELECT  value
                FROM    rec
                ) q2
        )
SELECT  TOP 10 *
FROM    rec

---
1
2
3
-- original set
1
2
-- everything except the last row of the previous set, that is 3
1
3
-- everything except the last row of the previous set, that is 2
1
2
-- everything except the last row of the previous set, that is 3, etc.
1

SQL Server pengembang pasti lupa melarangnya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server mengonversi varbinary ke string

  2. Bagaimana cara melakukan GROUP BY yang peka huruf besar-kecil?

  3. Menggunakan kolom urutan pengurutan dalam tabel database

  4. Perbarui Akun Email Basis Data (SSMS)

  5. identitas dari sql insert melalui jdbctemplate