2017-11-27 6 views
1

Entschuldigung, wenn das schon mal gefragt wurde, habe ich viele Fragen durchkämmt, konnte aber keine Antwort finden, die ich auf dieses Problem anwenden könnte.Ist es möglich, zwei Tabellen in einer Spalte zu verbinden, die eine Mischung aus castable und uncastable Daten enthält?

Ich stelle einen SSRS-Bericht aus einer Datenbank zusammen, auf die ich nur Lesezugriff habe, und habe Probleme beim Auswählen der Daten in dem Format, das ich möchte.

Table 1: Referenced Data 
==== ============= 
ID Description 
==== ============= 
1 Apple   
2 Orange  
3 Pear   
==== ============= 

Table 2: Records 
==== ====== ======== 
ID Data Tag 
==== ====== ======== 
1 1  List  
2 2  List  
3 Red String 
4 Blue String 
5 3  List  
==== ====== ======== 

Was würde ich gerne sehen ist:

Report 
========== ========= 
RecordNo Content 
========== ========= 
    1  Apple  
    2  Orange 
    3  Red  
    4  Blue  
    5  Pear  
========== ========= 

Das Problem ist die Datenspalte von T2 nvarchar ist, während die ID-Spalte von T1 Bigint ist. Während ich einen Konvertierungsfehler vermeiden kann, indem ich nur Zeilen mit dem List-Tag auswähle, verliere ich die String-Daten.

Gibt es eine Möglichkeit zu tun, was ich in einer Select-Anweisung zu tun versuche? Es fühlt sich an, als ob dies mit etwas Kreativität getan werden könnte, aber ich bin immer noch im Lernprozess und mein SQL ist noch nicht ganz da.

+0

Welche dbms ???????? – Eric

+0

Hallo Eric, Entschuldigung, es war SQL Server. – Jared

Antwort

0
SELECT 
    rec.Id 
    ,Content = CASE WHEN data.Id IS NOT NULL THEN data.Description ELSE rec.Data END 
FROM 
    Records rec 
    LEFT JOIN ReferencedData data 
    ON rec.Tag <> 'String' 
    AND rec.Data = CAST(data.Id AS NVARCHAR(50)) 

Sie können die BIGINT-NVARCHAR als Teil Ihrer Joinbedingung gegossen, die die impliziten Konvertierungsfehler zu vermeiden.

+0

Super, danke, Matt. Das hat den Trick gemacht. Ich war so damit beschäftigt, meinen Kopf über die Saite zu legen, um Bigint Conversion-Fehler zu bekommen. Ich habe nie darüber nachgedacht, stattdessen die Bigint zu spielen. Und danke an alle, die sich die Zeit genommen haben, damit zu helfen. – Jared

0

Man könnte so etwas wie dies versucht:

;WITH DataNum AS 
(
SELECT ID, Data FROM Records WHERE ISNUMERIC(Data) = 1 
) 
SELECT dn.ID, rd.Description 
FROM DataNum dn 
JOIN ReferencedData rd ON dn.Data = rd.ID 
UNION ALL 
SELECT ID, Data 
FROM Records 
WHERE ISNUMERIC(Data) <> 1 
0
select table2.id 
    , coalesce(table1.description, table2.Data) content 
    from table2 
    left join table1 
    on table2.tag <> 'String' 
    and table1.id = table2.data 
order by table2.id 

Dies funktioniert in MySQL (SQL Fiddle), sondern erfordert eine geringfügige Änderung in SQL Server (SQL Fiddle) und Oracle (SQL Fiddle):

select table2.id 
    , coalesce(table1.description,table2.Data) content 
    from table2 
    left join table1 
    on table2.tag <> 'String' 
    and table1.id = case when table2.tag <> 'String' then table2.data end 
order by table2.id 

und PostgreSQL (SQL Fiddle) braucht eine weitere tweek:

select table2.id 
    , coalesce(table1.description,table2.Data) as content 
    from table2 
    left join table1 
    on table2.tag <> 'String' 
    and cast(table1.id as varchar(6)) = table2.data 
order by table2.id 
Verwandte Themen