Pregunta

Tengo una secuencia de comandos que genera consultas de la siguiente manera (según la entrada del usuario):

SELECT * FROM articles 
 WHERE (articles.skeywords_auto ilike '%pm2%') 
  AND spubid IN (
   SELECT people.spubid FROM people 
   WHERE (people.slast ilike 'chow') 
   GROUP BY people.spubid) 
 LIMIT 1;

El conjunto de datos resultante:

Array ( [0] => 
  Array ( 
          [spubid] => A00603 
          [bactive] => t 
          [bbatch_import] => t 
          [bincomplete] => t 
          [scitation_vis] => I,X 
          [dentered] => 2009-07-24 17:07:27.241975 
          [sentered_by] => pubs_batchadd.php 
          [drev] => 2009-07-24 17:07:27.241975 
          [srev_by] => pubs_batchadd.php 
          [bpeer_reviewed] => t 
          [sarticle] => Errata: PM2.5 and PM10 concentrations from the Qalabotjha low-smoke fuels macro-scale experiment in South Africa (vol 69, pg 1, 2001) 
          [spublication] => Environmental Monitoring and Assessment 
          [ipublisher] => 
          [svolume] => 71 
          [sissue] => 
          [spage_start] => 207 
          [spage_end] => 210 
          [bon_cover] => f 
          [scover_location] => 
          [scover_vis] => I,X 
          [sabstract] => 
          [sabstract_vis] => I,X 
          [sarticle_url] => 
          [sdoi] => 
          [sfile_location] => 
          [sfile_name] => 
          [sfile_vis] => I
          [sscience_codes] => 
          [skeywords_manual] => 
          [skeywords_auto] => 1,5,69,2001,africa,assessment,concentrations,environmental,errata,experiment,fuels,low-smoke,macro-scale,monitoring,pg,pm10,pm2,qalabotjha,south,vol 
          [saward_number] => 
          [snotes] => 

)

El problema es que también necesito que todas las columnas de la tabla de "personas" (como se menciona en la selección secundaria) regresen como parte del conjunto de datos. No he hecho (obviamente) mucho con las selecciones secundarias en el pasado, por lo que este enfoque es muy nuevo para mí. ¿Cómo puedo retirar todas las filas / columnas coincidentes de la tabla de artículos tan bien como las filas / columnas de la tabla de personas?

¿Fue útil?

Solución

¿Está familiarizado con las combinaciones? Usando la sintaxis ANSI:

SELECT DISTINCT *
  FROM ARTICLES t
  JOIN PEOPLE p ON p.spubid = t.spudid AND p.slast ILIKE 'chow'
 WHERE t.skeywords_auto ILIKE'%pm2%'
 LIMIT 1;

El DISTINCT evita tener que definir un GROUP BY para cada columna devuelta desde ambas tablas. Lo incluí porque tenías el GROUP BY en tu subconsulta; No sé si fue realmente necesario.

Otros consejos

¿No podría usar una combinación en lugar de una sub-selección en este caso?

SELECT a.*, p.*
FROM articles as a
INNER JOIN people as p ON a.spubid = p.spubid
WHERE a.skeywords_auto ilike '%pm2%'
AND p.slast ilike 'chow'
LIMIT 1;

Permite comenzar desde el principio

  • No deberías necesitar un grupo para. En su lugar, utilice distinto (no está agregando nada en la consulta interna).
  • Para ver el contenido de la tabla interna, debes unirte a ella. El contenido no está expuesto a menos que aparezca en la sección de. Una combinación externa izquierda de la tabla de personas a la tabla de artículos debería ser equivalente a una consulta IN:

    SELECT *
    FROM people 
    LEFT OUTER JOIN articles ON articles.spubid = people.spubid 
    WHERE people.slast ilike 'chow' 
    AND articles.skeywords_auto ilike '%pm2%' 
    LIMIT 1
    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top