我想使用Union函数从SQL Server和Oracle联接数据,但是我在数据方面遇到一些麻烦。显示的输出具有相同的ID和不同的列值。
我已经尝试过Distinct&Group by,但无法解决此问题。
SELECT DISTINCT binusianid as ID,Name
FROM (SELECT binusian_id AS BinusianID,
Upper(nama) AS NAME
FROM hris.hris_db.dbo. master_data_pribadi_pegawai
WHERE stsrc = 'A'
UNION
SELECT emplid,
first_name + ' ' + ( CASE
WHEN last_name = first_name THEN ''
ELSE last_name
END ) AS NAME
FROM Openquery (oracle22,
'select a.EMPLID,b.FIRST_NAME,b.LAST_NAME from ps_n_lc_job_info a
JOIN PS_NAMES b ON b.EMPLID = a.EMPLID
WHERE a.N_ACTION_CODE NOT IN(''KELUAR'',''MENINGGAL'',''BATAL'',''DROPOUT'')'
))a
Group by a.BinusianID,Name
输出样本如下
谢谢
答案 0 :(得分:0)
首先,您在执行UNION时不需要分组依据或DISTINCT,因为UNION只会自动返回不同的行。
第二,如果您在具有不同用户的两个不同数据库中具有相同的ID,则无法区分它们。
如果两者应该包含相同的数据,那么您将遇到数据完整性问题。
如果它们的主键可以重叠,那么您需要在查询中添加一个DataSource列,以确保它们在ID + Source上变得唯一,而不仅仅是ID。
答案 1 :(得分:0)
正如@TomC Union所说,它将为您提供ID和Name的不同记录。 但是,这里的问题与数据有关,从Oracle返回的名称不同,但ID相同。因此,您将获得两条具有相同ID的记录。
如果您希望消除其中任何一个,可以使用SQL RowNumber()
函数。
我已经在SQL中创建了一个演示程序,目的只是为了解释如何在您的情况下使用它。
我又添加了一条记录以更好地解释。
具有重复的行的结果相同。在SQL和Oracle中相同的另一条记录由Union唯一返回。
如果您希望消除以下任何一种用途。