TSQL:向左外连接添加选择

时间:2012-11-12 10:36:35

标签: tsql join left-join

很抱歉,如果这个问题太基础了,我自学TSQL而且我不知道如何完成以下工作:

我有这个问题:

SELECT table1.name, table2.city AS city, table2.province
FROM table1 LEFT OUTER JOIN table2
ON table1.id = table2.id
WHERE table1.name NOT LIKE 'test'
ORDER BY city DESC 

我想补充一点:

SELECT table3.country 
FROM table3 LEFT JOIN table2 
ON table3.id = table2.id
WHERE table2.city = city

所以我可以得到这个结果:

name - city - province - country

我该怎么办?

非常感谢!

3 个答案:

答案 0 :(得分:0)

你可以这样做:

SELECT 
    table1.name, 
    table2.city AS city, 
    table2.province,
    table3.country
FROM 
    table1 
    LEFT OUTER JOIN table2
    ON table1.id = table2.id
    RIGHT JOIN table3
    ON table2.id = table3.id
WHERE 
    table1.name NOT LIKE 'test'
ORDER BY city DESC

答案 1 :(得分:0)

毫无疑问太基本了!我是一位忙于询问非常基本的Java Script问题的SQL专家。您也可以直接询问而不是沮丧地尝试理解您在网络上可以找到的内容,只要您努力,那么每个人都会感到高兴。

你所要求的实际上根本不是基本的,可以用很多方式来解释。一些不同的SQL会给你一些不同的结果。

首先,这部分:

WHERE table1.name NOT LIKE 'test'

使用没有通配符(%,_)的LIKE是不常见的。如果要排除完全“测试”的记录,请不要使用like,请改为使用:

WHERE table1.name <> 'test'

&LT;&GT;意思是'与'不同'

关于外部加入下一个表格,首先,你确定要将其加入吗?

您可能会关注此代码,但这并不是您要求的:

SELECT table1.name, table2.city AS city, table2.province
FROM table1 LEFT OUTER JOIN table2
ON table1.id = table2.id
LEFT OUTER JOIN table3
ON table1.id = table3.id
WHERE table1.name NOT LIKE 'test'
ORDER BY city DESC 

这当然缺少这一点:

AND table2.city = city

在这种情况下,您是尝试将列城市与文字字符串“city”匹配,还是尝试匹配列城市?如果是,则是table1或table2中的列

将问题整合起来的方式略有不同,这反过来意味着编写不同的SQL,这反过来会给你一个不同的答案。

所以想一想:

  1. table2中是否始终存在与table1匹配的记录?如果是这样,你可以使用INNER JOIN代替OUTER JOIN并节省一些复杂性
  2. 您应该绘制一张表格,其中的线条显示了它们的连接方式。
  3. 此外,如果您为表格提供一个不太通用的名称,它可以帮助我们想象您正在尝试做什么。

答案 2 :(得分:-1)

只需在一个SQL语句中使用两个连接:

SELECT table1.name, table2.city AS city, table2.province, table3.country
FROM table1
LEFT OUTER JOIN table2 ON table1.id = table2.id
LEFT OUTER JOIN table3 ON table3.id = table2.countryid
WHERE table1.name NOT LIKE 'test' and table2.city = 'Cityname'
ORDER BY city DESC 

(对不起,伙计们,我没有时间查看它,感谢您的评论。代码已修改。)