我有两张桌子。两者都有很多专栏。现在我有一个名为ID的公共列,我将加入该列。
现在因为如果只做这个
,这两个表中都会出现这个变量IDusing(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。
答案 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值的规则......