2016-07-04 71 views
0

我有兩個相同列的表,我需要在這兩個表中做出選擇,我想知道如何做到這一點的最佳方式,我的選擇測試是:執行從同一列的兩個表中選擇

SELECT  
    ISNULL(LoteDet.IdLoteDet, LoteDetPg.IdLoteDet) AS Expr1, 
    ISNULL(LoteDet.IDSac, LoteDetPg.IDSac) AS Expr2, 
    ISNULL(LoteDet.Comprom, LoteDetPg.Comprom) AS Expr3, 
    ISNULL(LoteDet.NossoNum, LoteDetPg.NossoNum) AS Expr4, 
    ISNULL(LoteDet.NossoNumDig, LoteDetPg.NossoNumDig) AS Expr5 
FROM 
    LoteDet 
CROSS JOIN 
    LoteDetPg 
WHERE 
    Expr1 = 500 

這是可能的嗎?

如何執行這種選擇的更好的方法,如果沒有找到一個表中的值,該值將在其他表....

------編輯

也許創建一個視圖是這種選擇的一個很好的選擇?

+2

您確定需要笛卡爾產品嗎? –

+1

你能展示預期的結果嗎? –

回答

0

使用COALESCE:

SELECT  
    COALESCE(LoteDet.IdLoteDet, LoteDetPg.IdLoteDet) AS Expr1, 
    COALESCE(LoteDet.IDSac, LoteDetPg.IDSac) AS Expr2, 
    COALESCE(LoteDet.Comprom, LoteDetPg.Comprom) AS Expr3, 
    COALESCE(LoteDet.NossoNum, LoteDetPg.NossoNum) AS Expr4, 
    COALESCE(LoteDet.NossoNumDig, LoteDetPg.NossoNumDig) AS Expr5 
FROM 
    LoteDet 
CROSS JOIN 
    LoteDetPg 
WHERE 
    Expr1 = 500 

看看這個文檔:https://msdn.microsoft.com/pt-br/library/ms190349.aspx

0

我相信這是要回報你什麼叫做笛卡爾乘積。這是開放式加入的結果,就像你上面那樣。該查詢將返回TONS記錄,因爲您沒有指定如何連接兩個表,它只會盲目地嘗試匹配列。至少,在JOIN中添加一個ON條件,以便您可以匹配ID /鍵。我想你想要的是一個IN的INNER JOIN;這將根據ID/Key返回所有匹配的行。

SELECT 
    CASE WHEN tbl1.Comprom IS NULL THEN tbl2.Comprom ELSE tbl1.Comprom END AS Expr1 
    CASE WHEN tbl1.Nossonum IS NULL THEN tbl2.Nossonum ELSE tbl1.Nossonum END AS Expr2 
FROM 
    tbl1 --LoteDet 
    INNER JOIN tbl2 --LoteDetPg 
     ON (tbl1.ID = tbl2.ID) 
WHERE 
    Expr1 = 500 --I know I swapped the expression values, use whichever expression you need here 

現在,只有行具有匹配ID將返回的值,它會使用從TBL 1的值,除非它爲空,那麼將使用值從TBL2。

編輯:我知道如果指定了WHERE,CROSS JOIN變成了INNER JOIN,但是WHERE是否需要包含這兩個表?我覺得Expr1 = 500仍然會產生笛卡兒積;有人能糾正我嗎?