Sql “忽略”;多次为“指定”列;CTE
使用以下CTE:Sql “忽略”;多次为“指定”列;CTE,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,使用以下CTE: WITH cteRoute AS ( SELECT * FROM CRROUTE cr JOIN crewleg cl on (cr.CDATE = cl.CDATE AND cr.CROUTE = cl.croute) left JOIN legmain lm on (lm.DAY = cl.DAY AND lm.DEP = cl.DEP and lm.CARRIER = cl.CARRIER and lm.FLT = cl.FL
WITH cteRoute AS (
SELECT *
FROM CRROUTE cr
JOIN crewleg cl on (cr.CDATE = cl.CDATE AND cr.CROUTE = cl.croute)
left JOIN legmain lm on (lm.DAY = cl.DAY AND lm.DEP = cl.DEP and lm.CARRIER = cl.CARRIER and lm.FLT = cl.FLT and lm.LEGCD = cl.LEGCD )
left JOIN legtimes lt on (lt.DAY = lm.DAY AND lt.DEP = lm.DEP and lt.CARRIER = lm.CARRIER and lt.FLT = lm.FLT and lt.LEGCD = lm.LEGCD )
where cr.cdate = 14000
and cr.croute = 138266498116
)
我收到一个错误,说在CTE中多次选择了承运人
是的,这是正确的。由于SELECT*
的原因,它确实被选中了多次
我的问题是不是如何解决这个问题。我知道如何通过专门枚举查询中的特定列来解决这个问题,而不是通过SELECT*
问题是,我使用的数据库来自第三方供应商(在希腊),我无法控制,他们在数据库设计和规范化方面非常,嗯,“草率”
这个查询将返回几百列。我真的不想特别列举它们
SQL Server查询引擎能够提取多个同名列:
SELECT 'this' as LABEL, 'that' as LABEL
将很好地工作,返回两个列,都名为“LABEL”
我的问题是,有没有办法告诉查询引擎忽略公共表表达式中重复的列名?
它可以在普通查询中这样做(如上所示),但在CTE中似乎无法这样做
所讨论的列是联接链接中使用的列,它们将始终相等
更新
这个问题类似于其他问题,但有一个独特的细微差别,使它不是一个重复。如果这一个实际上是重复的,那么无论如何,一定要把它标记为重复的,我会很高兴的,尤其是如果它有答案的话。这里有一种方法可以减少手工输入的内容 运行以下代码
SELECT
CASE
WHEN t.name = 'crewleg' THEN 'cl.' + c.name + ','
WHEN t.name = 'legmain' THEN 'lm.' + c.name + ','
WHEN t.name = 'legtimes' THEN 'lt.' + c.name + ','
END
FROM sys.tables t
join sys.columns c on c.object_id = t.object_id
WHERE t.name in ('crewleg', 'legmain', 'legtimes')
这将返回以
别名
和
开头的每一列,并在列名后面加一个逗号。把这个复制到记事本上。此时,您只需查找将导致问题的列,并给它们一个别名,这样它们就不会重复。您还可以使用记事本++查找并替换所有回车符,这样select在垂直方向上不会太长。别忘了删除最后一个逗号,因为它是多余的。然后将其复制并粘贴回您的select中。如果我的问题根本不可能实现,如果我被迫显式命名查询中的每一列,我将非常感谢您提供建议,告诉我如何减少“手指疲劳”。首先,我们对您使用的引擎一无所知。标准SQL不允许重复的列名。@drum-我特别提到我的服务器是SQL server。