¿Está "Dónde IN" con múltiples columnas definidas en SQL estándar?

Estoy trabajando en una consulta como esta:

SELECT * FROM requests where (id,langid) IN (SELECT nid,langid FROM node) 

Mis preguntas son

  • funciona esto en mysql y postgresql?
  • ¿esto es algo respaldado por Standard SQL?
  • Sé que no es la mejor solución y un JOIN funcionaría pero no estoy interesado en eso.

    El SQL estándar y portátil sería EXISTS … y es semánticamente el mismo IN

     SELECT * FROM requests R WHERE EXISTS (SELECT * FROM node n WHERE r.id = n.nid AND r.langid = n.langid ) 

    El IN de varias columnas no es portátil para SQL Server o Sybase al less.

    Otras notas:

    • Un JOIN puede requerir DISTINCT y no es lo mismo que IN o EXISTS.
    • La última opción es INTERSECT que es less común y funciona como IN / EXISTS
    • IIRC algunas versiones prehistóricas de MySQL (3.x?) No admiten la correlación de EXISTS

    Lo comprobé con PostgreSQL y funciona (es oficialmente compatible ), pero es su responsabilidad hacer que los types de columnas IDND y langid ↔ langid sean compatibles (o usar conversión explícita).

    Creo que es una construcción bastante estándar. Tengo un borrador de SQL: 2003 y hay un pnetworkingicado definido (así como el pnetworkingicado existe mencionado).

    8.4 <en pnetworkingicado>

    Función

    Especifique una comparación cuantificada.

    Formato

     <in pnetworkingicate> ::= <row value pnetworkingicand> <in pnetworkingicate part 2> <in pnetworkingicate part 2> ::= [ NOT ] IN <in pnetworkingicate value> <in pnetworkingicate value> ::= <table subquery> | ... (rest is not important here) 

    EDITAR:

    Como verificado, funciona bien en MySQL también (versión 5.0.90-log). Aquí hay un enlace de documentation.

    Su consulta funcionaría en Postgres. Lo mejor que sé, no en MySQL.

    La versión portátil para DBs que lo soportaría es:

     SELECT * FROM requests where ROW(id,langid) IN (SELECT nid,langid FROM node) 

    ( row es una palabra key reservada desde SQL: 1999 ).

    Una versión más portátil será usar exists() como se sugiere en la otra respuesta.

    Su código SQL es válido con respecto al estándar SQL-92. Puede confirmarlo usted mismo usando el validador en línea Mimer SQL-92 (también están disponibles los sabores SQL-99 y SQL: 2003 ). Sin embargo, debido a que es una característica de Full SQL-92, no está tan ampliamente implementado como debería ser.

    Relacionalmente hablando, el operador en cuestión es una semi-unión , para la cual ninguno de los Estándares SQL (y ninguna de las extensiones de los proveedores) tiene una syntax explícita.