Pergunta

Eu tenho um script que gera consultas da maneira a seguir (com base na entrada do usuário):

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;

O conjunto de dados 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] => 

)

O problema é que eu também preciso de todas as colunas da tabela 'People' (conforme referenciado no Sub Select) para voltar como parte do conjunto de dados. Eu não (obviamente) eu não fiz muito com o Sub Selects no passado, então essa abordagem é muito nova para mim. Como faço para recuar todas as linhas/colunas correspondentes da tabela de artigos, bem como das linhas/coluna da tabela de pessoas?

Foi útil?

Solução

Você está familiarizado com as junções? Usando a sintaxe 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;

As defesas distintas de terem que definir um grupo por cada coluna retornada de ambas as tabelas. Eu o incluí porque você tinha o grupo na sua subconsência; Não sei se era realmente necessário.

Outras dicas

Você não poderia usar uma junção em vez de um subselito neste 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;

Vamos começar do começo

  • Você não deve precisar de um grupo por. Use distinto (em vez disso, você não está agregado na consulta interna).
  • Para ver o conteúdo da tabela interna, você realmente precisa se juntar a ela. O conteúdo não é exposto, a menos que apareça na seção de seção. Uma junção externa esquerda da tabela de pessoas à tabela de artigos deve ser equivalente a uma consulta:

    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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top