2014-09-26 112 views
0

任何方法來做到這一點?SQL Server存儲過程選擇,存在,多個表

表1

1 
2 
3 
4 
5 

表2

3 (with the condition) 
4 (without the condition) 

我想:

  1. 選擇從表1中的所有記錄,如果它存在於表2,WH (條件)
  2. 如果表2中不存在,選擇表1中的所有記錄
  3. 合併兩個選擇結果。將所有結果與其創建日期進行排序。

舉例來說,結果應該是:

結果

1 
2 
3 
5 

回答

0

感謝所有響應。

我拿出我想要的答案:

SELECT * 
FROM Table1 t1 
    WHERE NOT EXISTS(SELECT 1 FROM Table2 t2 
           WHERE t1.ID = t2.ID 
           AND t2.CIF_KEY = @CifKey 
           AND t2.STATUS <> ''3'') 
    AND (condition in where clause) 
0

您可以通過執行實現這一目標:

SELECT t1.id 
FROM Table1 t1 
LEFT JOIN Table2 t2 on t1.id = t2.id 
WHERE condition OR t2.id IS NULL 
ORDER BY t1.CreatedDate; 

fiddle(我假定條件是t2.id!=4,但它可以是任何其他取決於其他呃數據在你的表中)。

0

希望這可以幫助。

SELECT t1.* from table1 t1 
JOIN table2 t2 
ON t1.ID = t2.ID 

UNION ALL 

SELECT t1.* from table1 t1 where ID in 
(
    SELECT t2.ID from table1 t1 except Select t2.ID from table2 t2 
) 

ORDER BY t1.CreatedDate 
+0

1 - 你忘了條件。 2 - 'table1 t1'中的SELECT t2.ID將失敗。 3 - 爲什麼'IN(... t1 EXCEPT ... t2)'而不是'NOT IN(... t2)'? 4 - 表現並不好([小提琴](http://sqlfiddle.com/#!3/03a84/7),看執行計劃)。 – 2014-09-26 10:46:54

0

可能有多種解決方案。 一種方式 我們可以使用兩種不同的查詢得到的結果集,最後合併結果集使用UNION

的另一種方式, 首先聲明是說,讓所有的結果從TABLE1設置,如果它存在的兩個TABLE2以及一些標準(在where子句中的條件) 表示使用INNER JOIN我們可以實現這個 第二個聲明是說從TABLE1中獲取所有不存在於TABLE2中的結果集 意味着與INNER JOIN ed一起查詢還包括TABLE1的數據如果不存在TABLE2 這裏我們可以藉助LEFT OUTER JOIN(取左表TABLE1)

0 (!條件:t1.Id = 4)

假設

讓我們嘗試同時使用的上述方式

---- -- --Step1 Create table and insert records 
---- create table1 with Id int identity columsn 
--CREATE TABLE Table1 (Id INT IDENTITY(1,1), CreatedDate smalldatetime default(getdate())); 
--go 
---- insert 1st 5 integers into Table1 
--INSERT INTO Table1 DEFAULT VALUES 
--go 5 

---- create Table2 with Id int column 
--CREATE TABLE Table2 (Id INT , CreatedDate smalldatetime default(getdate())); 
--go 
---- insert records 3,5 into Table2 
--INSERT INTO Table2(Id) VALUES (3), (4); 

-- -- -- Solution: one way 
; WITH cteMyFirstResult AS 
(
    -- 2.1. Select all records from Table1 if it exists in Table 2, where...(condition) 
    SELECT 
     Id,  CreatedDate 
    FROM Table1 AS t1 
    WHERE t1.Id IN (SELECT Id FROM Table2 AS t2) 
    AND t1.Id != 4 -- assumption it can be any condition 
),cteMySecondResult AS (
    -- 2.2. Select all records from Table1 if it not exists in Table2 
    SELECT 
     Id,  CreatedDate 
    FROM Table1 AS t1 WHERE t1.Id NOT IN (SELECT Id FROM Table2 AS t2) 
) 
    -- 2.3. Combine both select results. Sort all results with their created date. 
    SELECT 
     Id, CreatedDate 
    FROM cteMyFirstResult 
UNION 
    SELECT 
     Id, CreatedDate 
    FROM cteMySecondResult 
    ORDER BY CreatedDate; 

理解查詢 - - 解決方案:另一種方式(有錯誤)

SELECT t1.Id, t1.CreatedDate 
FROM Table1 AS t1 
LEFT JOIN Table2 AS t2 on t1.id = t2.id 
WHERE t1.Id != 4 
Order by T1.CreatedDate; 

- 在此查詢中,我們在完成聯接操作後使用條件。 - 因此,在基於JOIN條件過濾出結果集之後,將應用此條件 - 並且如果列Id中存在任何空記錄(用於連接)不會出現在最終結果集

- 爲了避免這一點,我們可以沿着包括NULL檢查與我們的標準

- - 解決方案:另一種方式

SELECT t1.Id, t1.CreatedDate 
FROM Table1 AS t1 
LEFT JOIN Table2 AS t2 on t1.id = t2.id 
WHERE (t1.Id != 4) OR t1.Id IS NULL -- include all your criteria within small-barcket) 
Order by T1.CreatedDate;