如果B不为空则在B上内连接A,否则为A.

时间:2013-07-23 13:51:51

标签: sql-server-2008 tsql

两张桌子:

prefix ( id, value )
---------------------
1  'hello'
2  'good afternoon'
3  'good night'


suffix ( id, value )
---------------------
1  'world'
3  'world'

我想得到 表prefix中的全部可以通过suffix

在表id加入

结果应如下所示:

prefix.id  prefix.value   
--------------------------
1          'hello'        
3          'good night'   
好吧 - 到目前为止很容易...... 但如果表格后缀为空,我想要表格prefix中的所有内容 没有子选择/ ctes或if....以及一个查询,满足这两个条件! 是否有任何技巧可以通过一些神奇的条款或其他棘手的东西来完成?

Just for testcases: SQL-fiddle

3 个答案:

答案 0 :(得分:3)

嗯,的一种方式,但我同意其他人的观点,即你的要求没有(实际)意义。

无论如何,你走了:

  1. 加入suffix表两次(每次加入左连接)。一个连接位于id列,另一个连接处于始终正确的状态。

  2. 将结果分组到输出中所需的prefix列以及第一个suffix实例的至少一个不可为空的列。

  3. 在HAVING子句中,设置第一个suffix列不为null或第二个suffix实例中非可空列的值数为0的条件。显然,每个组都有相同的行数,即每个prefix行的计数都相同。)

  4. 这是查询:

    SELECT prefix.id, prefix.value
    FROM prefix
    LEFT JOIN suffix ON prefix.id = suffix.id
    LEFT JOIN suffix AS test ON 1=1
    GROUP BY prefix.id, prefix.value, suffix.id
    HAVING suffix.id IS NOT NULL OR COUNT(test.id) = 0;
    

    还有一个演示at SQL Fiddle

答案 1 :(得分:2)

您需要ORNOT EXISTS

SELECT 
   prefix.id, prefix.value
FROM
   prefix 
WHERE 
   EXISTS(SELECT 1 from suffix WHERE prefix.id=suffix.id)
   OR NOT EXISTS(SELECT 1 FROM suffix)

Demo

答案 2 :(得分:0)

我猜答案是:不,你不能!

或者你可以:不,你不应该。