使用select *时是否有排除列?当然我可以列出我想要的列,但是如果说我查询一个包含30列的表并且我想要其中的27个,那么编写像SELECT * EXCLUDE a, b, c
有没有这样做?
答案 0 :(得分:0)
这是生成选择列表并消除两个表中重复列的一种方法。它假设您已经知道了两个表以及它们之间的关系。它使用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('Sales.SalesOrderDetail')
),
r AS
(
SELECT column_id, name FROM sys.columns
WHERE [object_id] = OBJECT_ID('Sales.SalesOrderHeader')
)
SELECT @sql = STUFF((SELECT ',' + 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('.[1]','nvarchar(max)'), 1, 1, '');
SELECT @sql = N'SELECT ' + @sql + '
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d
ON h.SalesOrderID = d.SalesOrderID;'
PRINT @sql;
-- EXEC 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;