Eu tenho uma consulta que usa três tabelas de pesquisa para obter todas as informações que eu preciso. Preciso ter DISTINCT
valores para uma coluna, no entanto, também preciso do restante dos dados associados a ela.
Meu código SQL:
SELECT acss_lookup.ID AS acss_lookupID,
acss_lookup.product_lookupID AS acssproduct_lookupID,
acss_lookup.region_lookupID AS acssregion_lookupID,
acss_lookup.document_lookupID AS acssdocument_lookupID,
product.ID AS product_ID,
product.parent_productID AS productparent_product_ID,
product.label AS product_label,
product.displayheading AS product_displayheading,
product.displayorder AS product_displayorder,
product.display AS product_display,
product.ignorenewupdate AS product_ignorenewupdate,
product.directlink AS product_directlink,
product.directlinkURL AS product_directlinkURL,
product.shortdescription AS product_shortdescription,
product.logo AS product_logo,
product.thumbnail AS product_thumbnail,
product.content AS product_content,
product.pdf AS product_pdf,
product.language_lookupID AS product_language_lookupID,
document.ID AS document_ID,
document.shortdescription AS document_shortdescription,
document.language_lookupID AS document_language_lookupID,
document.document_note AS document_document_note,
document.displayheading AS document_displayheading
FROM acss_lookup
INNER JOIN product ON (acss_lookup.product_lookupID = product.ID)
INNER JOIN document ON (acss_lookup.document_lookupID = document.ID)
ORDER BY product_displayheading ASC;
Desejo obter todos os produtos desta consulta, mas quero obtê-los apenas uma vez, porque estou preenchendo um menu suspenso para um aplicativo de pesquisa. Desejo que o usuário possa selecionar os produtos que estão nessa tabela (é por isso que só preciso deles uma vez).
Isso é muito complicado? Devo usar uma abordagem mais simplificada?
sql-server-2005
Stephmoreland
fonte
fonte
Respostas:
Uma outra abordagem ainda não mencionada é usar as funções da janela, por exemplo, row_number:
fonte
Existem algumas maneiras de fazer isso. Os dois principais que eu uso são expressões e subconsultas comuns de tabela. Usando um CTE, sua consulta seria mais ou menos assim:
Ou usando uma subconsulta:
Eu normalmente testo para ver qual é mais rápido e vou com essa.
Espero que isso ajude você.
fonte
(Acho que o que você está tentando fazer é "recolher" cada linha de resultado em um único produto; portanto, essa resposta segue essa suposição.)
Isso não é possível. Para obter os dados 1 .. * relacionados das outras tabelas, você deve retornar valores duplicados nas outras colunas.
Geralmente, a maneira de lidar com isso é executar a consulta como está e processar o conjunto de resultados associado no código do aplicativo. Eu costumo fazer isso usando uma abordagem de coleção de hash que acaba com entidades distintas de cada tipo em uma coleção com base em um valor-chave.
Embora essa abordagem custe mais em termos de tráfego de rede, geralmente é preferível fazer algo como executar várias consultas e unir os resultados conforme necessário no código do aplicativo. Depende de muitos fatores, incluindo a frequência com que as consultas são executadas e a quantidade de dados retornados.
fonte