2

一部の SQL ダイアレクトでは、次のように述べることができます。

SELECT * FROM SomeTable WHERE (val1,val2) IN 
  (SELECT val1,val2 FROM SomeOtherTable)

しかし、私が使用している TSQL (sql server 2k) でそれを行う方法がわかりません。

結合や連結された値を使用するなどの回避策を知っています (そして今のところ使用しています) が、TSQL にそれを行うために見落としている構文はありますか?

UPDATE : これは有効な SQL-99 構文です。そのため、パフォーマンスが向上したとしても、結合を回避策と見なします。私の質問はおそらく次のように言えます:

TSQL にこの構文の実装はありますか?

UPDATE2 : この構文を Mysql でテストしたところ、正常に動作しました。

4

5 に答える 5

10
SELECT  *
FROM    SomeTable st
WHERE   EXISTS
        (
        SELECT  1
        FROM    SomeOtherTable sot
        WHERE   sot.val1 = st.val1
                AND sot.val2 = st.val2
        )

これは、実際には、INコンストラクトがどのSEMI JOINメソッドでも最適化されるものです。

あなたの質問については、

この構文の実装はありますT-SQLか?

答えはノーです

ドキュメントが言うように:

1subqueryの結果セットがあります。この列は、と同じデータ型である必要があります。test_expression

于 2009-06-05T12:55:25.533 に答える
4

その構文のSQLサーバー実装はありません。次のようなことをする必要があります。

SELECT st.*
FROM SomeTable st
  INNER JOIN  
  (
    SELECT val1, val2 
    FROM SomeOtherTable 
    GROUP BY val1, val2
  ) sot ON sot.val1= st.val1 AND sot.val2 = st.val2
于 2009-06-05T12:54:50.777 に答える
1

参加することは、ここに行く方法です。

于 2009-06-05T12:51:53.153 に答える
0
Select SomeTable.*
FROM SomeTable, SomeOtherTable
WHERE SomeTable.Val1 = SomeOtherTable.Val1
    And SomeTable.Val2 = SoemeOtherTable.Val2

これを「回避策」と見なすべきではありません。これは、達成したいことを達成するための最も基本的で標準的な方法です。

編集:これは標準の「JOIN」構文ではないかもしれませんが、習慣です。

于 2009-06-05T12:56:47.670 に答える
0

IN は、単一列の配列でのみ機能します。IN 句を実行することを明示的に述べたので、次のようになります。

SELECT * FROM SomeTable 
WHERE val1 IN (SELECT val1 FROM SomeOtherTable WHERE val2 = SomeTable.val2) 
AND val2 IN (SELECT val2 FROM SomeOtherTable WHERE val1 = SomeTable.val1)

それに関するドキュメントをチェックしてください。各行に依存する where 句 (eg-WHERE SomeOtherTable.ID = SomeTable.MyOtherID) があるため、パフォーマンスが低下し、結合が絶対に適しています。

于 2009-06-05T12:52:46.600 に答える