TSQL如何根据不匹配的行返回两个表的结果

时间:2017-12-20 14:26:10

标签: sql-server tsql

我有两个简单的查询

SELECT Make,Color FROM(VALUES('Audi','Red'),('Audi','Blue'),('Audi','Black'),('BMW','Black'), ('宝马','黄色'))汽车(制造,颜色)

SELECT Color FROM(VALUES('Red'),('Blue'),('Black'),('Yellow'),('White'),('Silver'),('Brown')) AS颜色(颜色)

enter image description here

  

SQL1返回每个Car Maker提供的颜色
  SQL2返回希望购买的汽车颜色

我想列出每个Car Maker无法提供的颜色。
如。奥迪怀特,奥迪黄...

请帮助我完成TSQL查询。

更新:这不是一个重复的问题。我已经尝试过这个答案,但我没有得到我期待的结果。我希望人们在投票之前阅读这个问题或将其标记为重复。

2 个答案:

答案 0 :(得分:2)

这就是你得到的答案。正如我在评论中提到的那样假设你有Makes表,但是,由于你没有提供它,我还没有使用它。

WITH C AS (
    SELECT Color FROM (VALUES('Red'),('Blue'),('Black'),('Yellow'),('White'),('Silver'),('Brown')) AS Colors(Color)),
MC AS (
    SELECT Make, Color FROM (VALUES('Audi','Red'),('Audi','Blue'),('Audi','Black'),('BMW','Black'),('BMW','Yellow')) AS Cars(Make, Color)),
--This is the answer
--I assume you actually have a table for Car makes, however, you haven't incldued that in your data, so enither have I:
M AS (
    SELECT DISTINCT Make
    FROM MC)
SELECT *
FROM C
     CROSS APPLY M
WHERE NOT EXISTS (SELECT *
                  FROM MC
                  WHERE C.Color = MC.Color
                    AND M.Make = MC.Make);

答案 1 :(得分:1)

另一种选择是使用public void CreateDataTableFromTypedRow() { DataTable dt = new DataTable; dt.Rows.Add(_DataRow); }

EXCEPT