如何在连接两个表时删除一个连接键

时间:2015-11-10 21:46:23

标签: sql postgresql join

我有两张桌子。两者都有很多专栏。现在我有一个名为ID的公共列,我将加入该列。

现在因为如果只做这个

,这两个表中都会出现这个变量ID
using(var context = new YourContext(connectionString))
using(var transaction = context.Database.BeginTransaction(IsolationLevel.Serializable))
{
    var query = @"
SELECT TOP (89999) n = CONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id]))
INTO #AvialableNumbers
FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2
OPTION (MAXDOP 1);

CREATE UNIQUE CLUSTERED INDEX n ON #AvialableNumbers(n)

--Remove numbers that are in use.
delete #AvialableNumbers where n in (select Id from YourTable)

--Select the numbers out to the result set.
select n from #AvialableNumbers order by n

drop table #AvialableNumbers
";
    List<int> availableIDs = context.Database.SqlQuery<int>(query).ToList();

    /*
       Use the list of IDs here
    */

    context.SaveChanges();
    transaction.Commit();
}

这会产生错误,因为select a.*,b.* from table_a as a left join table_b as b on a.id=b.id 是重复的(存在于两个表中并且包含在两个表中)。

我不想在select语句中单独写下id的每一列。我有很多专栏,这很痛苦。我可以在join语句中重命名b的ID列,类似于SAS数据合并语句吗?

我正在使用Postgres。

1 个答案:

答案 0 :(得分:1)

Postgres将给出错误的重复输出列名称,但有些客户端会这样做。 (重复的名称也不是很有用。)

无论哪种方式,使用 USING 子句作为连接条件,将两个连接列折叠为一个:

SELECT *
FROM  tbl_a  a
LEFT  JOIN tbl_b b USING (id);

当您加入同一个表(自联接)时,会有更多重复的列名。这个查询开头几乎没什么意义。这开始对不同的表有意义。就像您在问题中所说的那样:I have two tables ...

要避免所有重复的列名,您必须在SELECT子句中明确列出它们 - 可能会处理列别名以获取具有不同名称的两个实例。

或者您可以使用 NATURAL 加入 - 如果这符合您无法解释的用例:

SELECT *
FROM  tbl_a  a
NATURAL LEFT JOIN tbl_b b;

此连接将共享相同名称的所有列并自动折叠 - 与列出USING子句中的所有常用列名完全相同。您需要了解可能的NULL值的规则......

Details in the manual.