我想left join
两张桌子。我的问题是数据库中不存在“正确”的表。我需要在查询期间创建它。更详细地说,“右”表是通过从现有表中提取(select ... where ...
)某些行来获得的。
我认为解决方案首先是join
,然后是select
。我认为它会比elect
和join
慢,但我意识到它根本不起作用。
例如:
左表:
| Dog | 1 |
| Cat | 0 |
右表:
| Dog | Paul | yes |
| Cat | Carin | no |
我想只使用第二列中第二列有“Carin”的那些行。所以,如果我在选择那些行后加入:
| Dog | 1 | Null | Null|
| Cat | 0 | Carin | no |
但如果我第一次加入,我会:
| Dog | 1 | Paul | yes |
| Cat | 0 | Carin | no |
然后,如果我选择Carin行,我会得到:
| Cat | 0 | Carin | no |
所以,你看到结果是不同的。在第一种情况下,我得到2行,在第二种情况下,我只得到1行。
那么,是否可以在加入前选择?
答案 0 :(得分:2)
我认为你在谈论引用在定义为join语句一部分的子查询中创建的字段。像这样:
SELECT a.id, b.name
FROM table AS a
LEFT JOIN
(SELECT name FROM table2) AS b
ON a.id = b.id
在此,您引用了b.name,即使b.name仅作为稍后在查询中创建的子查询的一部分存在。
如果这是你的意思,那么你绝对可以做到这一点。如果你不能,就没有理由加入子查询。
如果我误解了您的意图,请将您想要运行的实际查询添加到您的问题中,以便我更清楚地看到问题。
答案 1 :(得分:1)
您也可以加入常量。基本上,您将WHERE子句中的表达式移动到ON子句:
SELECT a.pet, a.neutered, b.name, b.allergic
FROM a
LEFT JOIN b
ON a.pet=b.pet AND b.name='Carin';
答案 2 :(得分:0)
Outis的例子对我不起作用,但是当我用WH替换AND时,这个有效。
SELECT a.pet, a.neutered, b.name, b.allergic
FROM a
LEFT JOIN b
ON a.pet=b.pet WHERE b.name='Carin';