Sql 使用否定子句连接

Sql 使用否定子句连接,sql,postgresql,Sql,Postgresql,我在Postgres数据库中得到了下表: 表示例: 我需要获取“DefaultName”中存在的数字,但与“DefaultName”不同的每个名称中不存在的数字。 在这种情况下,它将返回: --------------------------- names | numbers --------------------------- Charlie | 2 Amanda | 1 我正在尝试像下面这样的左连接,但我想不出一种方法来让Def

我在Postgres数据库中得到了下表:

表示例:

我需要获取“DefaultName”中存在的数字,但与“DefaultName”不同的每个名称中不存在的数字。 在这种情况下,它将返回:

---------------------------
   names    |    numbers
---------------------------
Charlie     |       2
Amanda      |       1
我正在尝试像下面这样的左连接,但我想不出一种方法来让DefaultName数字与其他名称的否定交叉

SELECT Test_Configs.name, Default_Configs.number

FROM Example AS Test_Configs  
    LEFT JOIN Example AS Default_Configs      
        ON Default_Configs.name = 'DefaultName'

我将按名称生成整个范围,并左键连接到基表,以消除当前的范围:

SELECT n.name, nr.number
FROM  (
   SELECT DISTINCT name
   FROM   example
   WHERE  name <> 'DefaultName'
   ) n                         -- all names except 'DefaultName'
CROSS  JOIN (
   SELECT number               -- assuming distinct numbers for 'DefaultName'
   FROM   example
   WHERE  name = 'DefaultName'
   ) nr                        -- combine with numbers from 'DefaultName'
LEFT   JOIN example x USING (name, number)
WHERE  x.number IS NULL;       -- minus existing ones
以下是排除另一个表(本例中为派生表)中存在的行的基本技术:


我将按名称生成整个范围,并左键连接到基表,以消除当前的范围:

SELECT n.name, nr.number
FROM  (
   SELECT DISTINCT name
   FROM   example
   WHERE  name <> 'DefaultName'
   ) n                         -- all names except 'DefaultName'
CROSS  JOIN (
   SELECT number               -- assuming distinct numbers for 'DefaultName'
   FROM   example
   WHERE  name = 'DefaultName'
   ) nr                        -- combine with numbers from 'DefaultName'
LEFT   JOIN example x USING (name, number)
WHERE  x.number IS NULL;       -- minus existing ones
以下是排除另一个表(本例中为派生表)中存在的行的基本技术:


这将需要几次过程,选择默认值、非默认组名,然后左键连接并检查空值。检查示例


这将需要几次过程,选择默认值、非默认组名,然后左键连接并检查空值。检查示例


构建名称和默认数字的所有组合。然后移除那些存在的

select othernames.name, defaultnumbers.number
from (select number from example where name = 'DefaultName') defaultnumbers
cross join (select distinct name from example where name <> 'DefaultName') othernames
except
select name, number from example;

构建名称和默认数字的所有组合。然后移除那些存在的

select othernames.name, defaultnumbers.number
from (select number from example where name = 'DefaultName') defaultnumbers
cross join (select distinct name from example where name <> 'DefaultName') othernames
except
select name, number from example;

定义缺失。名称、总体或某些给定的最小值/最大值的最小值和最大值之间缺少的值?或者只显示带有“DefaultName”的数字?不,它与顺序或最大/最小值无关。这与DefaultName中存在的值有关,但与其他名称无关。我更改了我的语句,也许我现在让自己更清楚一点。名称、总体或某些给定的最小值/最大值的最小值和最大值之间缺少的值?或者只显示带有“DefaultName”的数字?不,它与顺序或最大/最小值无关。这与DefaultName中的值有关,但与其他名称无关我更改了我的声明,也许我现在让自己更清楚了一点我没有得到我在帖子中想要的值。。。我想可能左连接语句不太好用,因为数字不会出现…@ZeldaElf:这很奇怪,因为我确实得到了您显示的结果:而且左连接确实应该很好用。是否涉及任何空值?或者所有列都定义为非空。对不起,朋友。在Fiddle我看到了我的插入错误,请原谅。成功了!但我还是不明白你是怎么做的。我会研究一下。谢谢!我没有得到我在帖子中想要的那些价值观。。。我想可能左连接语句不太好用,因为数字不会出现…@ZeldaElf:这很奇怪,因为我确实得到了您显示的结果:而且左连接确实应该很好用。是否涉及任何空值?或者所有列都定义为非空。对不起,朋友。在Fiddle我看到了我的插入错误,请原谅。成功了!但我还是不明白你是怎么做的。我会研究一下。谢谢!它也成功了,我的朋友!谢谢你过来!它也成功了,我的朋友!谢谢你过来!
select othernames.name, defaultnumbers.number
from (select number from example where name = 'DefaultName') defaultnumbers
cross join (select distinct name from example where name <> 'DefaultName') othernames
except
select name, number from example;