Domanda

Sto usando C # e SQL Server.

Date un'occhiata al seguente SQL:

SELECT table1.id, table1.description, table2.name, table2.surname 
FROM table1 
    INNER JOIN table2 ON table1.EmpID = table2.EmpID

E 'semplice e funziona bene. Recupera i dati dalla tabella Table1 proprio bene e interiore si unisce al table1.empid table2.name e table2.surname correttamente.

Ora, a volte table1.empid è nullo e quando è presente solo SQL ignora la "riga" con il valore nullo; che è abbastanza normale basandosi sui criteri.

Che cosa ho bisogno è quello di ottenere anche le "righe" con i valori nulli e quando table1.empid è nullo ho bisogno di impostare un valore personalizzato per table2.name e table2.surname.

Ho giocato con IsNull (), ma tutto quello che ho fatto è rendere ancora peggiore.

Qualche suggerimento?

Grazie

È stato utile?

Soluzione

Hai bisogno di fare un LEFT JOIN:

SELECT table1.id, table1.description, table2.name, table2.surname FROM table1
LEFT JOIN table2 ON table1.EmpID = table2.EmpID;

Altri suggerimenti

Provare a usare un UNION:

SELECT table1.id, table1.description, table2.name, table2.surname 
FROM table1 
INNER JOIN table2 ON table1.EmpID = table2.EmpID
UNION
SELECT table1.id, table1.description, 'Table 2 Null', 'Table 2 Null'
FROM table1
WHERE table1.empId is null

Se la tabella 1 è nulla e hai ancora bisogno i record che non è possibile avviare con questo. Inizia con table2 e unirsi table1.

SELECT table1.id, table1.description, ISNULL(table1.empid, "some new value") AS name, table2.surname 
FROM table2 
    LEFT OUTER JOIN table1 ON table2.EmpID = table1.EmpID
SELECT table1.id
       ,table1.description
       ,COALESCE(table2.name, 'DEFAULT') AS name
       ,COALESCE(table2.surname, 'DEFAULT') AS surname
FROM table1 
LEFT JOIN table2
    ON table1.EmpID = table2.EmpID

Ora nota, che questo sarà anche includere le persone quando l'EmpID non è nullo, ma comunque "non valido" se hanno un EmpID in tabella 1, ma non si trova in table2, quindi se questo è qualcosa che si desidera evitare, un altro opzione è questo:

SELECT table1.id
       ,table1.description
       ,table2.name
       ,table2.surname
FROM table1 
INNER JOIN table2
    ON table1.EmpID = table2.EmpID

UNION ALL

SELECT table1.id
       ,table1.description
       ,'DEFAULT' AS name
       ,'DEFAULT' AS surname
FROM table1 
WHERE table1.EmpID IS NULL
Select table1.id table1.description
    , Case When table1.EmpID Is Null Then 'Some Value' Else table2.name End As Table2Name
    , Case When table1.EmpID Is Null Then 'Some Value' Else table2.surname End As Table2Surname
From table1
    Left Join table2
        On table2.EmpID = table1.EmpID
Where table1.EmpID Is Null
        Or table2.EmpID Is Not Null
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top