【问题标题】:Combine SQL View with Left Outer Join Query结合 SQL 视图和左外连接查询
【发布时间】:2012-11-21 11:17:27
【问题描述】:

我有一个名为 Home 的视图:

CREATE VIEW `skohr`.`Home` AS
Select Song_OID, Song_Name, Album_Name, Artist_First_Name, Artist_Last_Name, Band_Name, Genre, Album_Art_File_Path
From Song, Album, Artist, Track_Number, Made
Where Song_OID = Track_Number.Song_OID_FK AND Album_OID=Track_Number.Album_OID_FK AND Album_OID=Made.Album_OID_FK AND Artist_OID=Made.Artist_OID_FK
ORDER BY Song_Name Asc

我在视图上运行了以下查询以获取我想要的表:

Select DISTINCT * From Home LEFT OUTER JOIN (SELECT * FROM Song_Setting, user WHERE User_OID=User_OID_FK) AS UserSongs
ON Song_OID=Song_OID_FK

如何将两个单独的查询合并为一个以创建一个视图?

【问题讨论】:

  • 您是否尝试过在查询前添加 CREATE VIEW 语句?
  • 这是 MySQL 吗? SQL 服务器?甲骨文?

标签: mysql sql outer-join sql-view


【解决方案1】:

::回复请求 MySQL 版本的评论::

我今天没有专门使用 MySQL,但有什么理由不能像对其他数据集一样使用子查询?像这样的:

Select DISTINCT * From 
(
    Select Song_OID, Song_Name, Album_Name, Artist_First_Name, Artist_Last_Name, Band_Name, Genre, Album_Art_File_Path
    From Song, Album, Artist, Track_Number, Made
    Where Song_OID = Track_Number.Song_OID_FK AND Album_OID=Track_Number.Album_OID_FK AND Album_OID=Made.Album_OID_FK AND Artist_OID=Made.Artist_OID_FK
) as a
LEFT OUTER JOIN (SELECT * FROM Song_Setting, user WHERE User_OID=User_OID_FK) AS b
ON a.Song_OID=b.Song_OID_FK

如果这对 MySQL 不起作用,我认为您可能需要考虑使用临时/内存表。因此,请考虑在 MySQL 中创建临时表,创建一个临时表并用我在下面的 CTE 中捕获的子查询填充它,然后将其加入到您的其他查询中。

如果是 SQL Server,你可以使用CTEs

只需将以下代码放入视图中,它就会为您提供所需的内容。

WITH Home AS 
(
Select Song_OID, Song_Name, Album_Name, Artist_First_Name, Artist_Last_Name, Band_Name, Genre, Album_Art_File_Path
From Song, Album, Artist, Track_Number, Made
Where Song_OID = Track_Number.Song_OID_FK AND Album_OID=Track_Number.Album_OID_FK AND Album_OID=Made.Album_OID_FK AND Artist_OID=Made.Artist_OID_FK
)
Select DISTINCT * From Home 
LEFT OUTER JOIN (SELECT * FROM Song_Setting, user WHERE User_OID=User_OID_FK) AS UserSongs
ON Song_OID=Song_OID_FK

【讨论】:

  • 为了澄清,我正在使用 MySQL。您是否有其他适用于 MySQL 的方法?
  • 编辑了进一步的想法,因为我知道它是特定于 MySQL 的。
【解决方案2】:

尝试创建视图

CREATE VIEW `skohr`.`MyNewView` AS

Select DISTINCT * From Home h
LEFT OUTER JOIN Song_Setting x
    ON h.Song_OID_FK = x.Song_OID
INNER JOIN user u
    ON u.User_OID = x.User_OID_FK  

【讨论】:

  • 我之前尝试过,但再次这样做时,我收到以下错误消息。在服务器执行 SQL 脚本 ERROR: Error 1349: View's SELECT contains a subquery in the FROM clause CREATE OR REPLACE VIEW skohr.Home2 AS Select DISTINCT * From Home LEFT OUTER JOIN (SELECT * FROM Song_Setting, user WHERE User_OID=User_OID_FK ) AS UserSongs ON Song_OID=Song_OID_FK
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
相关资源
最近更新 更多