任何方法來做到這一點?SQL Server存儲過程選擇,存在,多個表
表1
1
2
3
4
5
表2
3 (with the condition)
4 (without the condition)
我想:
- 選擇從表1中的所有記錄,如果它存在於表2,WH (條件)
- 如果表2中不存在,選擇表1中的所有記錄
- 合併兩個選擇結果。將所有結果與其創建日期進行排序。
舉例來說,結果應該是:
結果
1
2
3
5
任何方法來做到這一點?SQL Server存儲過程選擇,存在,多個表
表1
1
2
3
4
5
表2
3 (with the condition)
4 (without the condition)
我想:
舉例來說,結果應該是:
結果
1
2
3
5
感謝所有響應。
我拿出我想要的答案:
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)
您可以通過執行實現這一目標:
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
,但它可以是任何其他取決於其他呃數據在你的表中)。
希望這可以幫助。
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
可能有多種解決方案。 一種方式 我們可以使用兩種不同的查詢得到的結果集,最後合併結果集使用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;
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