AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 207488
Accepted
Martin Surasky
Martin Surasky
Asked: 2018-05-23 06:00:30 +0800 CST2018-05-23 06:00:30 +0800 CST 2018-05-23 06:00:30 +0800 CST

Pergunta de consulta SQL (itens que não possuem algum valor em uma coluna)

  • 772

Aqui está um enigma que preciso resolver com algum T-SQL Magic, tentei e falhei.

É uma dessas coisas que, antes de pensar na solução real, acho que posso resolver em 3 minutos com um pouco de T-SQL, mas quando a "borracha encontra a estrada" não consigo imaginar os operadores certos para alcançar essa lógica.

Gostaria de saber se alguém na comunidade do Stack Exchange pode encontrar uma solução elegante para este. Acho que com uma combinação de 3 ou 4 consultas usando tabelas temporárias ou cursores eu poderia encontrar a solução, mas não seria baseada em SET ...

Eu tenho uma tabela que se parece com isso (mais ou menos...)

CREATE TABLE Computers (
   ID               int IDENTITY(1,1),
   ComputerName     varchar(255),
   OS               varchar(255),
   AppName          varchar(255),
   AppVersion       varchar(10)
)

Portanto, cada linha tem um nome de computador, um valor de sistema operacional (que pode ser Windows 7 OU Windows 10) e, em seguida, uma descrição de um aplicativo (por exemplo, AppName = "Notepad ++", AppVersion = "7.5.6")

ComputerName   | OS           | AppName   | AppVersion
Computer 1     | Windows 7    | App 1     | 1.0
Computer 1     | Windows 7    | App 2     | 1.0
Computer 1     | Windows 7    | App 3     | 1.0
Computer 2     | Windows 10   | App 4     | 1.0
Computer 2     | Windows 10   | App 5     | 1.0
Computer 3     | Windows 10   | App 4     | 1.0
Computer 4     | Windows 7    | App 4     | 1.0
Computer 4     | Windows 7    | App 5     | 1.0
Computer 5     | Windows 7    | App 1     | 1.0
Computer 5     | Windows 7    | App 4     | 1.0
Computer 5     | Windows 7    | App 5     | 1.0

A forma como funciona é assim: se um computador tiver 10 aplicativos instalados, você terá 10 linhas nesta tabela (uma para cada aplicativo). O nome do computador e o sistema operacional serão repetidos (por favor, não inicie uma discussão sobre a 2ª forma normal... esta é estritamente uma pergunta sobre uma consulta para resolver um problema).

Então, o problema que preciso resolver é: preciso encontrar uma lista de computadores ONDE o sistema operacional é o Windows 7 (isso é EAAAASY), mas ...

Esses computadores só devem aparecer na minha lista se TODOS os aplicativos relatados nesta tabela para esse PC forem relatados como sendo usados ​​em outros computadores com Windows 10.

Se um computador com Windows 7 tiver aplicativos que não estão listados em um computador com Windows 10, eles não devem aparecer nesta lista. Todo e qualquer aplicativo para computador deve estar em conformidade com esta regra para que o computador se qualifique na minha lista.

A ideia é saber que os computadores que estou recebendo no meu SELECT têm todos os aplicativos que eu sei que funcionam para o Windows 10, então eles devem ser mais seguros para migrar.

Amostra:

Para quem está tentando isso em casa, aqui está um CREATE TABLE e alguns INSERTs, você tem a ideia certa de como são meus dados

-- Create the table
 CREATE TABLE Computers (
    ComputerName    varchar(255),
    OS              varchar(255),
    AppName         varchar(255),
    AppVersion      varchar(10)
 )

 -- Insert some values...
 INSERT INTO Computers
 VALUES 
 ('Computer 1', 'Windows 7', 'App 1', '1.0'),
 ('Computer 1', 'Windows 7', 'App 2', '1.0'),
 ('Computer 1', 'Windows 7', 'App 3', '1.0'),
 ('Computer 2', 'Windows 10', 'App 4', '1.0'),
 ('Computer 2', 'Windows 10', 'App 5', '1.0'),
 ('Computer 3', 'Windows 10', 'App 4', '1.0'),
 ('Computer 4', 'Windows 7', 'App 4', '1.0'),
 ('Computer 4', 'Windows 7', 'App 5', '1.0'),
 ('Computer 5', 'Windows 7', 'App 1', '1.0'),
 ('Computer 5', 'Windows 7', 'App 4', '1.0'),
 ('Computer 5', 'Windows 7', 'App 5', '1.0')
  • Com este exemplo, o único computador que se qualifica para minha consulta seria o Computador 4, pois é o único computador com Windows 7 em que TODOS os aplicativos associados a ele (Aplicativos 4 e 5) também existem em pelo menos uma linha para um PC com Windows 10.

  • O computador 5 não se qualifica porque um dos aplicativos associados a ele ("Aplicativo 1") só existe neste conjunto em outro computador Windows 7 (Computador 1), portanto não posso dizer que este aplicativo já está funcionando em um PC com Windows 10 .

  • Os computadores 2 e 3 são Windows 10. Então, isso deve ser suficiente para descartá-los....

  • O computador 1 também NÃO deve se qualificar, todos os seus aplicativos não estão sendo executados em PCs com Windows 10.

Espero que faça sentido...

select t-sql
  • 2 2 respostas
  • 84 Views

2 respostas

  • Voted
  1. Best Answer
    jyao
    2018-05-23T07:35:21+08:002018-05-23T07:35:21+08:00

    Acredito que a consulta a seguir fornecerá o nome correto do computador

     select ComputerName from dbo.computers
     where os= 'windows 7'
     except
     select ComputerName from dbo.computers
     where os= 'windows 7'
     and appname not in (select appname from dbo.computers where os='windows 10')
    

    O resultado é:

    insira a descrição da imagem aqui

    • 2
  2. paparazzo
    2018-05-23T10:10:32+08:002018-05-23T10:10:32+08:00

    Outra abordagem

    DECLARE @t TABLE (ComputerName varchar(255), OS varchar(255), AppName varchar(255), AppVersion varchar(10))
    
     INSERT INTO @t VALUES 
     ('Computer 1', 'Windows 7',  'App 1', '1.0'),
     ('Computer 1', 'Windows 7',  'App 2', '1.0'),
     ('Computer 1', 'Windows 7',  'App 3', '1.0'),
     ('Computer 2', 'Windows 10', 'App 4', '1.0'),
     ('Computer 2', 'Windows 10', 'App 5', '1.0'),
     ('Computer 3', 'Windows 10', 'App 4', '1.0'),
     ('Computer 4', 'Windows 7',  'App 4', '1.0'),
     ('Computer 4', 'Windows 7',  'App 5', '1.0'),
     ('Computer 5', 'Windows 7',  'App 1', '1.0'),
     ('Computer 5', 'Windows 7',  'App 4', '1.0'),
     ('Computer 5', 'Windows 7',  'App 5', '1.0') 
    
     declare @a table (AppName varchar(255) primary key);
     insert into @a 
     select distinct AppName
       from @t 
      where OS = 'Windows 10' ;
     select * from @a;
    
     select t7.ComputerName
       from @t t7 
       left join @a a 
         on t7.AppName = a.AppName 
      where t7.OS = 'Windows 7'
      group by t7.ComputerName 
      having count(*) = count(a.AppName);
    
    • 0

relate perguntas

  • Como alterar as configurações do gerenciador de configuração do servidor SQL usando o TSQL?

  • Como posso obter uma lista de nomes e tipos de coluna de um conjunto de resultados?

  • MS SQL: Use o valor calculado para calcular outros valores

  • Como posso saber se um banco de dados SQL Server ainda está sendo usado?

  • Implementando uma consulta PIVOT

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve