sql >> データベース >  >> RDS >> Sqlserver

IN句に列は存在しませんが、SQLは実行されます

    これは、外部のテーブルの場合に機能します クエリにはその名前の列があります。これは、外部クエリの列名がサブクエリで使用可能であり、サブクエリのSELECTリストで外部クエリ列を選択することを意図的に意味している可能性があるためです。

    例:

    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)
    

    ダミアンが観察しているように、このあまり明白ではない「落とし穴」から身を守るための最も安全な方法は、サブクエリで列名を修飾する習慣を身につけることです。

    -- 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. 動的WebサイトにRESTfulAPIを使用する

    2. mysqlデータベースの自動パーティショニング

    3. 複数の列で複数のアイテムを検索する

    4. EF4.3コードファーストで複合型との間でマッピングするにはどうすればよいですか?