Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Kolumna nie istnieje w klauzuli IN, ale działa SQL

To zadziała, jeśli stół w zewnętrznym zapytanie ma kolumnę o tej nazwie. Dzieje się tak, ponieważ nazwy kolumn z zewnętrznego zapytania są dostępne dla podzapytania i można celowo wybrać zewnętrzną kolumnę zapytania z listy SELECT podzapytania.

Na przykład:

CREATE TABLE #test_main (colA integer) 
CREATE TABLE #test_sub (colB integer)

-- Works, because colA is available to the sub-query from the outer query. However,
-- it's probably not what you intended to do:
SELECT * FROM #test_main WHERE colA IN (SELECT colA FROM #test_sub)

-- Doesn't work, because colC is nowhere in either query
SELECT * FROM #test_main WHERE colA IN (SELECT colC FROM #test_sub)

Jak zauważa Damien, najbezpieczniejszym sposobem ochrony przed tym nieoczywistym „łatwą” jest przyzwyczajenie się do kwalifikowania nazw kolumn w podzapytaniu:

-- Doesn't work, because colA is not in table #test_sub, so at least you get
-- notified that what you were trying to do doesn't make sense.
SELECT * FROM #test_main WHERE colA IN (SELECT #test_sub.colA FROM #test_sub)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Użyj OBJECT_NAME(), aby uzyskać nazwę obiektu z jego object_id w SQL Server

  2. Czy istnieje prosty sposób, aby EntityFramework używał wartości domyślnych SQL?

  3. Wykonywanie przygotowanych instrukcji generowanych przez NHibernate w SQL Server Management Studio

  4. Jak COUNT_BIG() działa w SQL Server

  5. Uzyskaj pierwszy dzień tygodnia w SQL Server