2014-02-21 50 views
0

我使用下面的select語句獲取需要的記錄,這是來自CARS_PRIMARY表的CAR_COLOR,它不存在於CAR_SECONDARY表(也包含CAR_COLOR列)中,但是如何做我現在包括對結果的其他匹配列,所以它retuns與SELECT語句的結果如下SQL MINUS結果包含結果中的其他列

SELECT CAR_COLOR 
FROM CARS_PRIMARY 
MINUS 
SELECT CAR_COLOR 
FROM CARS_SECONDARY 

目前相關的其他列的結果 是

PINK 
BLUE 
GREEN 

我需要

PINK SUV 4DOOR  
BLUE CAR 2DOOR 
GREEN TRUCK 2DOOR 
+1

SQL Server有減號我想你想時除外。 – Mihai

+0

我會看看它是否有效,並在返​​回選定結果時將其標記爲已回答。 – ConfusedDeer

+0

@Mihai我有MS SQL Server 2008 R2和MINUS工作。 – ConfusedDeer

回答

2

可以使用的NOT IN而不是MINUS

SELECT * 
FROM cars_primary 
WHERE car_color NOT IN 
    (SELECT car_color 
    FROM cars_secondary) 

或可替代

SELECT * 
FROM cars_primary 
WHERE NOT EXISTS 
    (SELECT NULL 
    FROM cars_secondary 
    WHERE cars_secondary.car_color = cars_primary.car_color) 
+0

你應該使用'NOT EXISTS'而不是'NOT IN',因爲後者不一定正確處理'NULLS'。它也[更快](http://www.sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join)。 – Zane

+0

我會如何用'NOT EXISTS'重寫select語句 – ConfusedDeer

+0

@ConfusedDeer將它添加到我的答案中。 –

1

MINUS/EXCEPT

SELECT * 
FROM CARS_PRIMARY 
WHERE CAR_COLOR IN (
    SELECT CAR_COLOR 
    FROM CARS_PRIMARY 
    EXCEPT 
    SELECT CAR_COLOR 
    FROM CARS_SECONDARY 
); 

說明:

我們首先得到一組中所有顏色的CARS_PRIMARY但不是在CARS_SECONDARY,然後從CARS_PRIMARY選擇所有列有該顏色。

我用EXCEPT,但如果MINUS的作品,你可以使用它。


LEFT JOIN

SELECT CP.* 
FROM CARS_PRIMARY CP 
LEFT JOIN CARS_SECONDARY CS 
    ON (CP.CAR_COLOR = CS.CAR_COLOR) 
WHERE CS.CAR_COLOR IS NULL; 

說明:

我們做外部聯接從CARS_PRIMARYCARS_SECONDARY的顏色,然後丟棄具有CARS_SECONDARY值的所有行。


NOT IN

SELECT * 
FROM CARS_PRIMARY 
WHERE CAR_COLOR NOT IN (
    SELECT CAR_COLOR 
    FROM CARS_SECONDARY 
); 

說明

我們選擇CARS_PRIMARY所有列在顏色不是從CARS_SECONDARY的顏色組。


NOT EXISTS

SELECT * 
FROM CARS_PRIMARY CP 
WHERE NOT EXISTS (
    SELECT * 
    FROM CARS_SECONDARY CS 
    WHERE CS.CAR_COLOR = CP.CAR_COLOR 
); 

說明

我們選擇CARS_PRIMARY所有列在顏色不存在CARS_SECONDARY

+0

Msg 156,Level 15,State 1,Line 8 關鍵字'select'附近的語法不正確。 Msg 102,Level 15,State 1,Line 10 ')'附近的語法不正確 – ConfusedDeer

+0

@ConfusedDeer我有一些表名錯誤,請你再試一次嗎?另外,我用'EXCEPT';請替換爲'MINUS',如果這對你有用。 – SQB

+0

@D斯坦利的答案在我嘗試過你之後已經有效了,所以我想我必須給他答案,但我會試着去看看它是否可行。 – ConfusedDeer