tsql union,order by和view

时间:2016-09-20 14:11:15

标签: sql-server tsql

我试图从不同数据库中的表(在同一服务器(2014)和相同的表结构上)中提取一组数据并将其放在视图中。我已经找到了几个关于集合排序和联合的讨论,但是我在弄清楚结果集本身时遇到了一些问题。这是脚本:

CREATE VIEW OrderCheck (Source, [Order No], [Date], FirstName) as

SELECT Top 2 'Set1', Order_No, format(Order_Date,'g'), First_Name
FROM        db1.dbo.Orders 
Union all
SELECT Top 2 'Set2', Order_No, format(Order_Date,'g'), First_Name
FROM        db2.dbo.Orders
Union all
SELECT Top 2 'Set3', Order_No, format(Order_Date,'g'), First_Name 
FROM        db3.dbo.Orders

ORDER BY    Order_No desc

如果我自己运行select / union查询,我会得到这些结果,这就是我想要的结果:

Set3    60098   9/14/2016 8:32 AM   Lydia
Set3    60097   9/13/2016 12:28 PM  Jeané
Set1    30098   9/19/2016 4:12 PM   Joshua
Set1    30097   9/19/2016 1:35 PM   Cynthia
Set2    11050   9/20/2016 9:24 AM   Lorrie
Set2    11049   9/19/2016 11:12 PM  Dawnisha

但是当我使用视图(从OrderCheck中选择*)时,我得到了这个:

Set1    10011   11/14/2013 9:13 AM  Jaime
Set1    10012   11/14/2013 9:54 AM  Eric
Set2    10011   11/14/2013 9:13 AM  Jaime
Set2    10012   11/14/2013 9:54 AM  Eric
Set3    60098   9/14/2016 8:32 AM   Lydia
Set3    60097   9/13/2016 12:28 PM  Jeané

最后,如果我在视图内部或外部运行查询但没有任何“order by”,我会得到这个:

Set1    10011   11/14/2013 9:13 AM  Jaime
Set1    10012   11/14/2013 9:54 AM  Eric
Set2    10011   11/14/2013 9:13 AM  Jaime
Set2    10012   11/14/2013 9:54 AM  Eric
Set3    10011   11/14/2013 9:13 AM  Jaime
Set3    10012   11/14/2013 9:54 AM  Eric

因此,您可以在视图中看到,设置1行会替换除字符串文字之外的第2行。如果没有“order by”,则set 1将替换set 2 set 3.“Union All”vs“Union”没有区别,也没有请求TOP行的数量。对我来说似乎很奇怪,但我希望有一个合乎逻辑的解释,即使我的研究,我只是缺席了。

非常感谢你! 吉姆凯莱赫

2 个答案:

答案 0 :(得分:1)

除非您使用外部订单

,否则无法保证订购
hasOwnProperty

保证订单

以下是来自Itzik Ben-Gan

的报价
  

视图中的ORDER BY子句(使用Top *时)仅保证   为TOP选项提供逻辑过滤目的。如果查询视图但未指定   外部查询中的ORDER BY子句,不保证呈现顺序

根据这篇文章,前100%也是有害的。TOP 100 Percent ORDER BY Considered Harmful

*强调我的

答案 1 :(得分:0)

TOP 2履行两个完全不同的角色 - 它可以定义结果集的排序顺序,也可以完成其他功能的定义,例如ORDER BY <Result set sorting criteria>ORDER BY。有时它可能同时完成这两个角色。

这是您查询的另一种表述:

TOP

您可以在此明确指出应选择每个dependencies { wearApp project(':Wearable') 的标准。但是,如果您在视图中使用它,则会省略最终public abstract class ViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = "") { Debug.Write($"--- CLASS ViewModel Called OnPropertyChanged for object: {propertyName} -------- \n"); PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } } ,因为视图无法指定结果集排序条件。充其量,您可能会强制服务器接受此类namespace WPFApplication.Ui { public class AccentColorMenuData { public string Name { get; set; } public Brush BorderColorBrush { get; set; } public Brush ColorBrush { get; set; } private ICommand changeAccentCommand; public ICommand ChangeAccentCommand { get { return this.changeAccentCommand ?? (changeAccentCommand = new SimpleCommand { CanExecuteDelegate = x => true, ExecuteDelegate = x => this.DoChangeTheme(x) }); } } protected virtual void DoChangeTheme(object sender) { var theme = ThemeManager.DetectAppStyle(Application.Current); var accent = ThemeManager.GetAccent(this.Name); ThemeManager.ChangeAppStyle(Application.Current, accent, theme.Item1); } } public class AppThemeMenuData : AccentColorMenuData { protected override void DoChangeTheme(object sender) { var theme = ThemeManager.DetectAppStyle(Application.Current); var appTheme = ThemeManager.GetAppTheme(this.Name); ThemeManager.ChangeAppStyle(Application.Current, theme.Item2, appTheme); } } public class RemoteSystemsViewModel : ViewModel { public List<AccentColorMenuData> AccentColors { get; set; } public List<AppThemeMenuData> AppThemes { get; set; } public RemoteSystemsViewModel() { // create accent color menu items for the demo this.AccentColors = ThemeManager.Accents .Select(a => new AccentColorMenuData() { Name = a.Name, ColorBrush = a.Resources["AccentColorBrush"] as Brush }) .ToList(); // create metro theme color menu items for the demo this.AppThemes = ThemeManager.AppThemes .Select(a => new AppThemeMenuData() { Name = a.Name, BorderColorBrush = a.Resources["BlackColorBrush"] as Brush, ColorBrush = a.Resources["WhiteColorBrush"] as Brush }) .ToList(); } } } 子句的存在,但它不会提供任何实际保证。

从您的问题中不清楚每个public partial class ConfigurationView : UserControl { private readonly RemoteSystemsViewModel _viewModel; public RemoteSystemsView() { _viewModel = new RemoteSystemsViewModel(); InitializeComponent(); DataContext = _viewModel; } void SelectionChanged(object sender, SelectionChangedEventArgs e) { } } 定义的实际标准应该是什么。