2 Stimmen

Gibt es eine Implementierung dieser Abfrage-Syntax in TSQL?

In einigen SQL-Dialekten können Sie (etwas wie) angeben:

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

Aber ich weiß nicht, wie man das in dem TSQL (Sql Server 2k) macht, das ich verwende.

Ich kenne (und verwende im Moment) Umgehungslösungen wie die Verwendung von Joins oder verketteten Werten, aber gibt es eine Syntax in TSQL, die ich übersehe, um genau das zu tun?

UPDATE : Dies ist eine gültige SQL-99-Syntax, deshalb halte ich eine Verknüpfung für einen Workaround, auch wenn sie leistungsfähiger wäre. Meine Frage ist vielleicht besser formuliert als :

Gibt es eine Implementierung dieser Syntax in TSQL?

UPDATE2 : Ich habe gerade diese Syntax om Mysql getestet und es funktioniert dort gut.

10voto

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

Das ist eigentlich das, was ein IN Konstrukt ist optimiert für die Verwendung mit beliebigen SEMI JOIN Methode.

Was Ihre Frage betrifft,

Gibt es eine Implementierung dieser Syntax in T-SQL ?

die Antwort lautet non

Als Dokumentation dice:

subquery die eine Ergebnismenge von un Spalte. Diese Spalte muss denselben Datentyp haben wie test_expression .

4voto

Joel Coehoorn Punkte 377088

Es gibt keine Sql-Server-Implementierung dieser Syntax. Sie müssen etwas wie dieses tun:

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

1voto

Kjensen Punkte 11932

Der Beitritt wäre hier der richtige Weg.

0voto

Eric Punkte 87889

IN funktioniert nur bei einspaltigen Arrays. Da Sie ausdrücklich angegeben haben, dass Sie eine IN-Klausel verwenden möchten:

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)

Überprüfen Sie die Dokumentation darauf. Da es eine Where-Klausel gibt, die von jeder Zeile abhängt (z. B. WHERE SomeOtherTable.ID = SomeTable.MyOtherID), wird dies die Leistung beeinträchtigen, und eine Verknüpfung ist absolut der richtige Weg.

0voto

TheTXI Punkte 36691
Select SomeTable.*
FROM SomeTable, SomeOtherTable
WHERE SomeTable.Val1 = SomeOtherTable.Val1
    And SomeTable.Val2 = SoemeOtherTable.Val2

Sie sollten dies nicht als "Workaround" betrachten. Dies ist die grundlegendste und Standardmethode, um das zu erreichen, was Sie erreichen wollen.

Bearbeiten: Es ist zwar nicht die Standard-Syntax für "JOIN", aber es ist eine Gewohnheit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X