选择子查询

时间:2013-03-07 12:02:20

标签: sql sql-server tsql stored-procedures

我的程序中有两个选择,但是我想只选择第一个Select中的IDENTIFICACAO_A与第二个Select中的IDENTIFICACAO_B共有的行。

查询:

SELECT
(CONVERT(VARCHAR,fic.reg_codigo_lotado_atual) + '.' + CONVERT(VARCHAR,fic.cla_codigo) + '.' + CONVERT(VARCHAR,fic.reg_codigo_lotado_origem) + '.' + CONVERT(VARCHAR,fic.fic_numero_livro) + '/' + CONVERT(VARCHAR,fic.fic_versao)) AS IDENTIFICACAO_A,
cla.cla_nome,
fic.fic_ca,
fic.fic_fa,
fic.reg_codigo_lotado_atual,
fic.cla_codigo,
fic.reg_codigo_lotado_origem,
fic.fic_numero_livro,
fic.fic_versao,
fic.fic_ato_oficial,
fic_localizacao_numero,
fic_localizacao_data_em,
qua.qua_nome,
fic.fic_localizacao_do,
adm.adm_codigo_ua,
adm.adm_codigo_uv,
adm.adm_digito,
adm.adm_decodificada,
adm.adm_sigla,
form.for_nome,
fic.fic_ocupacao_data,
fic.fic_ocupacao_do,
fic.fic_ocupacao_data_cessacao,
fic.fic_ocupacao_do_cessacao,
ser.ser_nome,
ser.ser_rg,
ser.ser_cpf,
fic.fic_ocupacao_observacao,
esp.esp_descricao,
fic.fic_alteracao_vigencia,
fic.fic_alteracao_decreto,
fic.fic_alteracao_data,
fic.fic_alteracao_qua_codigo,
fic.fic_alteracao_do,
fic.fic_situacao_vc,
fic.fic_situacao_pp,
fic.fic_situacao_ocupado,
fic.fic_nova_identificacao,
fic.fic_observacoes_gerais
FROM
SICAF.dbo.tab_fichas AS fic
 INNER JOIN
SICAF.dbo.tab_classes AS cla ON cla.cla_codigo = fic.cla_codigo
 LEFT JOIN
SICAF.dbo.tab_sub_quadros AS qua ON qua.qua_codigo = fic.qua_codigo
 LEFT JOIN
SICAF.dbo.tab_unidade_adm AS adm ON adm.adm_codigo = fic.adm_codigo
 LEFT JOIN
SICAF.dbo.tab_formas AS form ON form.for_codigo = fic.for_codigo
 LEFT JOIN
SICAF.dbo.tab_servidores AS ser ON ser.ser_codigo = fic.ser_codigo
 LEFT JOIN
SICAF.dbo.tab_especies AS esp ON esp.esp_codigo = fic.esp_codigo


SELECT
(CONVERT(VARCHAR,fic.reg_codigo_lotado_atual) + '.' + CONVERT(VARCHAR,fic.cla_codigo) + '.' + CONVERT(VARCHAR,fic.reg_codigo_lotado_origem) + '.' + CONVERT(VARCHAR,fic.fic_numero_livro) + '/' + CONVERT(VARCHAR,fic.fic_versao)) AS IDENTIFICACAO_B,
cla.cla_nome,
fic.fic_ca,
fic.fic_fa,
fic.reg_codigo_lotado_atual,
fic.cla_codigo,
fic.reg_codigo_lotado_origem,
fic.fic_numero_livro,
fic.fic_versao,
fic.fic_ato_oficial,
fic_localizacao_numero,
fic_localizacao_data_em,
qua.qua_nome,
fic.fic_localizacao_do,
adm.adm_codigo_ua,
adm.adm_codigo_uv,
adm.adm_digito,
adm.adm_decodificada,
adm.adm_sigla,
form.for_nome,
fic.fic_ocupacao_data,
fic.fic_ocupacao_do,
fic.fic_ocupacao_data_cessacao,
fic.fic_ocupacao_do_cessacao,
ser.ser_nome,
ser.ser_rg,
ser.ser_cpf,
fic.fic_ocupacao_observacao,
esp.esp_descricao,
fic.fic_alteracao_vigencia,
fic.fic_alteracao_decreto,
fic.fic_alteracao_data,
fic.fic_alteracao_qua_codigo,
fic.fic_alteracao_do,
fic.fic_situacao_vc,
fic.fic_situacao_pp,
fic.fic_situacao_ocupado,
fic.fic_nova_identificacao,
fic.fic_observacoes_gerais
FROM
SICAF2.dbo.tab_fichas AS fic
 INNER JOIN
SICAF2.dbo.tab_classes AS cla ON cla.cla_codigo = fic.cla_codigo
 LEFT JOIN
SICAF2.dbo.tab_sub_quadros AS qua ON qua.qua_codigo = fic.qua_codigo
 LEFT JOIN
SICAF2.dbo.tab_unidade_adm AS adm ON adm.adm_codigo = fic.adm_codigo
 LEFT JOIN
SICAF2.dbo.tab_formas AS form ON form.for_codigo = fic.for_codigo
 LEFT JOIN
SICAF2.dbo.tab_servidores AS ser ON ser.ser_codigo = fic.ser_codigo
 LEFT JOIN
SICAF2.dbo.tab_especies AS esp ON esp.esp_codigo = fic.esp_codigo

如何返回两种选择?

4 个答案:

答案 0 :(得分:1)

您可以在两个查询之间使用内部联接:

Select * From 
(
SELECT
(CONVERT(VARCHAR,fic.reg_codigo_lotado_atual) + '.' + CONVERT(VARCHAR,fic.cla_codigo) + '.' + CONVERT(VARCHAR,fic.reg_codigo_lotado_origem) + '.' + CONVERT(VARCHAR,fic.fic_numero_livro) + '/' + CONVERT(VARCHAR,fic.fic_versao)) AS IDENTIFICACAO_A,
cla.cla_nome,
fic.fic_ca,
fic.fic_fa,
fic.reg_codigo_lotado_atual,
fic.cla_codigo,
fic.reg_codigo_lotado_origem,
fic.fic_numero_livro,
fic.fic_versao,
fic.fic_ato_oficial,
fic_localizacao_numero,
fic_localizacao_data_em,
qua.qua_nome,
fic.fic_localizacao_do,
adm.adm_codigo_ua,
adm.adm_codigo_uv,
adm.adm_digito,
adm.adm_decodificada,
adm.adm_sigla,
form.for_nome,
fic.fic_ocupacao_data,
fic.fic_ocupacao_do,
fic.fic_ocupacao_data_cessacao,
fic.fic_ocupacao_do_cessacao,
ser.ser_nome,
ser.ser_rg,
ser.ser_cpf,
fic.fic_ocupacao_observacao,
esp.esp_descricao,
fic.fic_alteracao_vigencia,
fic.fic_alteracao_decreto,
fic.fic_alteracao_data,
fic.fic_alteracao_qua_codigo,
fic.fic_alteracao_do,
fic.fic_situacao_vc,
fic.fic_situacao_pp,
fic.fic_situacao_ocupado,
fic.fic_nova_identificacao,
fic.fic_observacoes_gerais
FROM
SICAF.dbo.tab_fichas AS fic
 INNER JOIN
SICAF.dbo.tab_classes AS cla ON cla.cla_codigo = fic.cla_codigo
 LEFT JOIN
SICAF.dbo.tab_sub_quadros AS qua ON qua.qua_codigo = fic.qua_codigo
 LEFT JOIN
SICAF.dbo.tab_unidade_adm AS adm ON adm.adm_codigo = fic.adm_codigo
 LEFT JOIN
SICAF.dbo.tab_formas AS form ON form.for_codigo = fic.for_codigo
 LEFT JOIN
SICAF.dbo.tab_servidores AS ser ON ser.ser_codigo = fic.ser_codigo
 LEFT JOIN
SICAF.dbo.tab_especies AS esp ON esp.esp_codigo = fic.esp_codigo
)tbl1

Inner Join 
(
SELECT
(CONVERT(VARCHAR,fic.reg_codigo_lotado_atual) + '.' + CONVERT(VARCHAR,fic.cla_codigo) + '.' + CONVERT(VARCHAR,fic.reg_codigo_lotado_origem) + '.' + CONVERT(VARCHAR,fic.fic_numero_livro) + '/' + CONVERT(VARCHAR,fic.fic_versao)) AS IDENTIFICACAO_B,
cla.cla_nome,
fic.fic_ca,
fic.fic_fa,
fic.reg_codigo_lotado_atual,
fic.cla_codigo,
fic.reg_codigo_lotado_origem,
fic.fic_numero_livro,
fic.fic_versao,
fic.fic_ato_oficial,
fic_localizacao_numero,
fic_localizacao_data_em,
qua.qua_nome,
fic.fic_localizacao_do,
adm.adm_codigo_ua,
adm.adm_codigo_uv,
adm.adm_digito,
adm.adm_decodificada,
adm.adm_sigla,
form.for_nome,
fic.fic_ocupacao_data,
fic.fic_ocupacao_do,
fic.fic_ocupacao_data_cessacao,
fic.fic_ocupacao_do_cessacao,
ser.ser_nome,
ser.ser_rg,
ser.ser_cpf,
fic.fic_ocupacao_observacao,
esp.esp_descricao,
fic.fic_alteracao_vigencia,
fic.fic_alteracao_decreto,
fic.fic_alteracao_data,
fic.fic_alteracao_qua_codigo,
fic.fic_alteracao_do,
fic.fic_situacao_vc,
fic.fic_situacao_pp,
fic.fic_situacao_ocupado,
fic.fic_nova_identificacao,
fic.fic_observacoes_gerais
FROM
SICAF2.dbo.tab_fichas AS fic
 INNER JOIN
SICAF2.dbo.tab_classes AS cla ON cla.cla_codigo = fic.cla_codigo
 LEFT JOIN
SICAF2.dbo.tab_sub_quadros AS qua ON qua.qua_codigo = fic.qua_codigo
 LEFT JOIN
SICAF2.dbo.tab_unidade_adm AS adm ON adm.adm_codigo = fic.adm_codigo
 LEFT JOIN
SICAF2.dbo.tab_formas AS form ON form.for_codigo = fic.for_codigo
 LEFT JOIN
SICAF2.dbo.tab_servidores AS ser ON ser.ser_codigo = fic.ser_codigo
 LEFT JOIN
SICAF2.dbo.tab_especies AS esp ON esp.esp_codigo = fic.esp_codigo
)tbl2
On tbl1.IDENTIFICACAO_A=tbl2.IDENTIFICACAO_B

答案 1 :(得分:1)

您可以使用:

select your_fields from table1

intersect

select your_fields from table2

答案 2 :(得分:1)

使用union。

在两个查询中将键列重命名为相同,我还建议将两个查询保存为临时表。

因此,假设您将第一个查询存储在临时表q1中,将第二个查询存储在q2中,并且两者的关键列都是id

select from q1 where q1.id in (select id from q2)
union
select from q2 where q2.id in (select id from q1)

希望我很清楚。

答案 3 :(得分:0)

您可以在此处使用IN。 T1是来自第一个查询的连接表组,T2是来自第二个查询的连接表组。语法如下。

Select col1,col2,...
From T1
Where IDENTIFICACAO_A in (
   Select IDENTIFICACAO_B
   From T2
)

您可以将IDENTIFICACAO_AIDENTIFICACAO_B列名替换为连接结果

如果T1T 2(如上所述)相同,则

SELECT X AS IDENTIFICACAO_A,
   cla.cla_nome,
   fic.fic_ca,...
FROM T1
WHERE X = Y

您可以使用字符串连接函数替换XY