2012-01-28 57 views
0

我正在嘗試編寫一個腳本,該腳本將爲表A中具有NULL值的表格創建不同的行,但對於相同的列表B具有值。如何查找其中一個表具有NULL值而另一個表具有值的行

場景:我有2個表: 表A和表B具有表A中的相同的列

的值是

| ID | Name  | LicenseNo | NationalLicenseNumber | 
| 1 | 'ABC,XYZ' | NULL  | NULL     | 
| 1 | 'CDS,ABD' | NULL  | NULL     | 

表B具有類似的值:

| 1 | 'XYZ ABC' | 1234567 | 976633    | 
| 1 | 'ABD CDS' | 4324223 | 304242    | 

等等...我想顯示結果,它顯示了我在兩個表的所有列中的值。 任何幫助,將不勝感激 感謝

+1

表A應該在哪個列上加入表B?您提供的ID全部爲「1」。這是故意的嗎?此外,請澄清「給我表中有不同的行,在表A中有NULL值,但對於相同的列表B有值」 - 你想要達到什麼*確切* – perfectionist 2012-01-28 12:21:53

回答

1

試試這個選擇:

select a.ID,a.Name,a.LicenseNo,a.NationalLicenseNumber, 
     b.ID,b.Name,b.LicenseNo,b.NationalLicenseNumber 
from TableA a 
left outer join TableB b on a.ID=b.ID 
where 
    ((a.Name is null) and (b.Name is not null)) 
or ((a.Name is not null) and (b.Name is null)) 
    ((a.LicenseNo is null) and (b.LicenseNo is not null)) 
or ((a.LicenseNo is not null) and (b.LicenseNo is null)) 
    ((a.NationalLicenseNumber is null) and (b.NationalLicenseNumber is not null)) 
or ((a.NationalLicenseNumber is not null) and (b.NationalLicenseNumber is null)) 

它加入對ID兩個表,並只保留行,其中對應的列的空岬是不同的。

編輯替換(a.Name is null) <> (b.Name is null)導致語法錯誤與較長的表達式不比較布爾值。

+0

我的理解是,至少在SQL Server 2008中,默認設置是,涉及null的比較總是返回NULL,因此這個查詢將不起作用。實際上,當我嘗試執行時,SQL Server爲我提供了一個「<'」附近的「語法錯誤」。此外,這將返回惱人的「Expr_1,Expr_2」作爲TableB的列名稱,而不會混淆列。 – XIVSolutions 2012-01-28 13:01:28

+0

@XIVSolutions此查詢不會將可爲空的值相互比較。相反,它比較* boolean * values - 在「null」運算符中比較列與'null'的結果。 – dasblinkenlight 2012-01-28 13:04:57

+0

是的,我有這個想法,但它仍然給我在SSMS的語法錯誤。除此之外,一旦我意識到它是比較布爾人,我幾乎沒有發佈我的答案。但是當我嘗試這種方法時,它拋出了以前提到的語法錯誤。我錯過了什麼嗎? – XIVSolutions 2012-01-28 13:10:29

0

儘量簡單的檢查,如果不爲空:

SELECT * 
FROM TABLE_A 
WHERE Name IS NOT NULL AND LicenseNo IS NOT NULL AND NationalLicenseNumber IS NOT NULL 
UNION 
SELECT * 
FROM TABLE_B 
WHERE Name IS NOT NULL AND LicenseNo IS NOT NULL AND NationalLicenseNumber IS NOT NULL 
0

這將工作。此外,它解決了第二組列使用相同名稱的問題,通過別名TableB的列名將其簡單地返回爲「Expr_1」,「Expr_2」等。 這將返回TableB中的所有行(根據您的發佈,保留所有適當的值),並將它們添加到ID字段中的TableA中的行(您可能會在其他任何字段中具有NULL值的行) 。這將返回ID匹配的兩個表以及TableA中任何一個或多個關聯字段爲空的記錄。

SELECT  
    a.ID, 
    a.Name, 
    a.LicenseNo, 
    a.NationalLicenseNo, 
    b.ID AS b_ID, 
    b.Name AS b_Name, 
    b.LicenseNo AS b_LicenseNo, 
    b.NationalLicenseNo AS b_NationalLicenseNo 
FROM   
    TableA AS a RIGHT OUTER JOIN 
    TableB AS b ON a.A = b.A 
WHERE  
    (a.Name IS NULL) OR 
    (a.LicenseNo IS NULL) OR 
    (a.NationalLicenseNo IS NULL) 
相關問題