使用 select * 时是否有排除列?当然我可以只列出我想要的列,但是如果说我正在查询一个有 30 列的表并且我想要其中的 27 列,那么写一些类似的东西会更干净SELECT * EXCLUDE a, b, c
有没有办法做到这一点?
使用 select * 时是否有排除列?当然我可以只列出我想要的列,但是如果说我正在查询一个有 30 列的表并且我想要其中的 27 列,那么写一些类似的东西会更干净SELECT * EXCLUDE a, b, c
有没有办法做到这一点?
这是生成选择列表并消除两个表中重复列的一种方法。它假定您已经知道这两个表以及它们之间的关系。这使用 AdventureWorks 和表 Sales.SalesOrderDetail 和 Sales.SalesOrderHeader。请注意,具有相同名称的多个表中的列不一定是冗余的 - 例如,可以独立于订单详细信息项目修改订单,现在您的查询 (a) 忽略详细级别修改日期,并且 (b) 不t 在结果中清楚地表明哪个修改日期已公开(除非用户阅读查询文本,如果他们有权访问它)。
DECLARE @sql nvarchar(max);
;WITH l AS
(
SELECT column_id, name FROM sys.columns
WHERE [object_id] = OBJECT_ID(N'Sales.SalesOrderDetail')
),
r AS
(
SELECT column_id, name FROM sys.columns
WHERE [object_id] = OBJECT_ID(N'Sales.SalesOrderHeader')
)
SELECT @sql = STUFF((SELECT N',' + CHAR(13) + CHAR(10) + CHAR(9)
+ CASE WHEN l.column_id IS NOT NULL THEN 'h.'
ELSE 'd.' END + QUOTENAME(COALESCE(l.name,r.name)) FROM r
FULL OUTER JOIN l
ON l.name = r.name
ORDER BY COALESCE(l.column_id, 255), r.column_id
FOR XML PATH(''),
TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 1, N'');
SELECT @sql = N'SELECT ' + @sql + '
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d
ON h.SalesOrderID = d.SalesOrderID;'
PRINT @sql;
-- EXEC sys.sp_executesql @sql;
结果:
SELECT
h.[SalesOrderID],
d.[SalesOrderDetailID],
d.[CarrierTrackingNumber],
d.[OrderQty],
d.[ProductID],
d.[SpecialOfferID],
d.[UnitPrice],
d.[UnitPriceDiscount],
d.[LineTotal],
h.[rowguid],
h.[ModifiedDate],
h.[RevisionNumber],
h.[OrderDate],
h.[DueDate],
h.[ShipDate],
h.[Status],
h.[OnlineOrderFlag],
h.[SalesOrderNumber],
h.[PurchaseOrderNumber],
h.[AccountNumber],
h.[CustomerID],
h.[SalesPersonID],
h.[TerritoryID],
h.[BillToAddressID],
h.[ShipToAddressID],
h.[ShipMethodID],
h.[CreditCardID],
h.[CreditCardApprovalCode],
h.[CurrencyRateID],
h.[SubTotal],
h.[TaxAmt],
h.[Freight],
h.[TotalDue],
h.[Comment]
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d
ON h.SalesOrderID = d.SalesOrderID;