2017-10-18 134 views
2

我已經編寫SQL代碼來合併來自不同表格的若干columns組合不同表格中的列

SELECT * 
FROM 
(
    SELECT PD_BARCODE 
    FROM docsadm.PD_BARCODE 
    WHERE SYSTEM_ID = 11660081 
) t, 
(
    SELECT A_JAHRE 
    FROM docsadm.A_PD_DATENSCHUTZ 
    WHERE system_ID = 2066 
) t2, 
(
    SELECT PD_PART_NAME 
    FROM docsadm.PD_FILE_PART 
    WHERE system_id = 11660082 
) t3; 

代碼工作正常,但如果WHERE子句未在表中找到了我的一個,結果是空甚至其他列具有價值。你如何解決這個問題?

+0

沒有加入條件嗎? – jarlh

+0

添加一些示例表格數據和預期結果。全部作爲格式化文本。 – jarlh

回答

1

看起來你正在做三個子查詢表之間的交叉連接。如果每個子查詢返回一個單值,這可能只會產生有意義的輸出。我可能會建議您改爲使用UNION ALL這裏:

SELECT ISNULL(PD_BARCODE, 'NA' AS value 
FROM docsadm.PD_BARCODE WHERE SYSTEM_ID = 11660081 
UNION ALL 
SELECT ISNULL(A_JAHRE, 'NA') 
FROM docsadm.A_PD_DATENSCHUTZ WHERE system_ID = 2066 
UNION ALL 
SELECT ISULL(PD_PART_NAME, 'NA') 
FROM docsadm.PD_FILE_PART WHERE system_id = 11660082 

如果三列是選擇上面的聯合查詢可能需要稍微修改並不都具有相同的類型(我假設是varchar在我查詢)。

如果你真的需要數據作爲單獨的列的這三點,那麼你可以只包括三個子查詢在外部項目中進行選擇:

SELECT 
    (SELECT ISNULL(PD_BARCODE, 'NA') 
    FROM docsadm.PD_BARCODE WHERE SYSTEM_ID = 11660081) AS PD_BARCODE, 
    (SELECT ISNULL(A_JAHRE, 'NA') 
    FROM docsadm.A_PD_DATENSCHUTZ WHERE system_ID = 2066) AS A_JAHRE, 
    (SELECT ISNULL(PD_PART_NAME, 'NA') 
    FROM docsadm.PD_FILE_PART WHERE system_id = 11660082) AS PD_PART_NAME; 

注意,因爲上面寫的,我們簡單地包括子查詢作爲select語句中的值。但是,當您編寫原始查詢時,您將作爲單獨的表加入子查詢。

+0

perfekt第二個查詢效果很好 – ertan2002

+0

@ ertan2002如果第一個查詢出錯,可能是因爲列的類型不一樣。在這種情況下,我們可以嘗試將所有內容轉換爲'varchar'用於顯示目的。 –

+0

我有這部分的問題=> SELECT ISNULL(PD_BARCODE,'NA'AS值和你寫了ISULL,但我修復了它,你錯過了parantesis但仍然不工作 – ertan2002

1

這是Query

您可以通過您所需的字或值替換單詞「empty

 

SELECT isnull(
      (
       SELECT PD_BARCODE 
       FROM docsadm.PD_BARCODE 
       WHERE SYSTEM_ID = 11660081 
      ), 'Empty') AS PD_BARCODE, 
     isnull(
      (
       SELECT A_JAHRE 
       FROM docsadm.A_PD_DATENSCHUTZ 
       WHERE system_ID = 2066 
      ), 'Empty') AS A_JAHRE, 
     isnull(
      (
       SELECT PD_PART_NAME 
       FROM docsadm.PD_FILE_PART 
       WHERE system_id = 11660082 
      ), 'Empty') AS PD_PART_NAME; 

+0

它也可以,謝謝 – ertan2002

1

這是因爲你會得到每個你查詢你正試圖把達作爲唯一的一個值的特殊情況下,柱。在這種情況下,您可以使用SQL PIVOT clause和UNION ALL查詢,如下所示。在這種情況下MIN可以用於聚合。

這意味着,您可以根據需要逐行獲取數據,即使是多個不同的字段,然後一次將其轉換爲列。

SELECT * FROM 
(
    SELECT 'PD_BARCODE' as KeyItem, PD_BARCODE Name from docsadm.PD_BARCODE 
    where SYSTEM_ID=11660081 

    UNION ALL 
    SELECT 'A_JAHRE', A_JAHRE from docsadm.A_PD_DATENSCHUTZ 
    where system_ID=2066 

    UNION ALL 
    select 'PD_PART_NAME', PD_PART_NAME from docsadm.PD_FILE_PART 
    where system_id=11660082 

) VTABLE 
PIVOT(MIN(Name) 
    FOR KeyItem IN ([PD_BARCODE], [A_JAHRE], [PD_PART_NAME])) as pivotData; 
+0

非常感謝你的解釋使用pivot更好嗎?因爲其他查詢也在工作 – ertan2002

+0

它基本上取決於查詢生成的執行計劃。我建議您檢查每個查詢的實際執行計劃,並檢查具有最佳執行計劃和數據檢索時間的查詢。沒有問題,這是SQL人更直觀的語法來理解查詢中究竟發生了什麼 – Amit

+0

再次感謝你:)它假設只返回一個字段,因爲我使用的是系統ID,並且只檢索每個表中的一個字段。我認爲應該沒有那麼多的性能問題.. – ertan2002

相關問題