2013-03-07 102 views
0

我在我的過程中有兩個選擇,但我只想選擇第一個選擇中的IDENTIFICACAO_A與第二個選擇中的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 

我能做些什麼來回報這兩個選擇?

回答

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 
+0

我需要返回兩個選擇,因爲我想顯示兩個collunms的值之間的差異。 – 2013-03-07 12:35:12

+0

你可以在你的外部選擇中取得不同:(tbl1.ColumnName -tbl2.ColumnName)作爲AnotherColumnName – 2013-03-07 12:42:16

0

您可以在這裏使用IN。 T1是來自第一查詢的連接表的組,而T2是來自第二查詢的連接表的組。語法如下。

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

可以與它們連接結果

如果T1T 2(如上所述)是相同,則更換IDENTIFICACAO_AIDENTIFICACAO_B列名;

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

可以更換XY與它們的字符串拼接功能。

1

您可以使用:

select your_fields from table1 

intersect 

select your_fields from table2 
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) 

希望我很清楚。