在SQL(MSSQL,Oracle等等)中,在连接表时,将过滤器添加到JOIN语句而不是在WHERE子句中有什么好处?
即
SELECT * FROM X INNER JOIN Y ON X.A = Y.A WHERE X.B = 'SOMETHING'
Run Code Online (Sandbox Code Playgroud)
与
SELECT * FROM X INNER JOIN Y ON X.A = Y.A AND X.B = 'SOMETHING'
Run Code Online (Sandbox Code Playgroud)
我意识到这并不适用于所有情况,但我注意到在某些情况下,通过将过滤条件放在JOIN语句中似乎可以获得性能提升.但是,因为它是JOIN语句的一部分,所以它也会使它表现得有些奇怪.
思考?
那里有几个ActiveRecord样式的查询构建器库.有些是独立的,有些是内置于框架中的.但是,当涉及到复杂的SQL时,它们确实遇到了WHERE和HAVING子句的问题.将其他数据库放在一边 - 我试图想出一个MySQL和PostgreSQL兼容的WHERE()方法,可以解决这些当前方法的垮台.
接下来是一长串的想法和例子,展示了迄今为止我能想到的最好的想法和例子.但是,我似乎无法解决所有用例,我觉得我的部分解决方案很草率.任何可以用解决所有这些问题的方法回答的人不仅会回答这个问题 - 而且还会负责解决几年来一直困扰着PHP实施的问题.
共同运营商
= Equal
<> Not Equal
> Greater Than
< Less Than
>= Greater Than Or Equal
<= Less Than Or Equal
BETWEEN between values on right
NOT logical NOT
AND logical AND
OR logical OR
Run Code Online (Sandbox Code Playgroud)
示例where子句
SELECT ... FROM table...
WHERE column = 5
WHERE column > 5
WHERE column IS NULL
WHERE column IN (1, 2, 3)
WHERE column NOT IN (1, 2, 3)
WHERE column …Run Code Online (Sandbox Code Playgroud) 数据库中某行中的每次数据更改都应将以前的行数据保存在某种历史记录中,以便用户可以回滚到上一行数据状态.这种方法有什么好的做法吗?尝试使用DataContract并对数据对象进行序列化和反序列化,但它对复杂对象变得不那么混乱.
所以更清楚一点:
我使用NHibernate进行数据访问,并希望避免数据库依赖(对于使用SQL Server 2005进行测试)
我的目的是提供数据历史记录,以便每次用户都可以回滚到以前的某些版本.
使用示例如下:
我希望我能给你有效的信息.
我有一个表使用3个外键到其他表.当我执行左连接时,我得到重复的列.MySQL表示USING语法将减少重复列,但没有多个键的示例.
鉴于:
mysql> describe recipes;
+------------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+-------+
| ID_Recipe | int(11) | NO | PRI | NULL | |
| Recipe_Title | char(64) | NO | | NULL | |
| Difficulty | int(10) unsigned | NO | | NULL | |
| Elegance | int(10) unsigned | NO | | NULL | |
| Quality | int(10) unsigned | NO | | NULL | …Run Code Online (Sandbox Code Playgroud) 我知道通常情况下,构建mysql查询以命名您需要的每个项目总是更好的性能但是例如在个人资料页面上我可能需要除了少数几个项目之外的所有项目.
SELECT user_name,f_name,l_name,country,usa_state,other_state,zip_code,city,gender,birth_date,date_created,date_last_visit,
user_role,photo_url,user_status,friend_count,comment_count,forum_post_count,referral_count,referral_count_total,
setting_public_profile,setting_online,profile_purpose,profile_height,profile_body_type,profile_ethnicity, profile_occupation,profile_marital_status,profile_sex_orientation,profile_home_town,profile_religion,
profile_smoker,profile_drinker,profile_kids,profile_education,profile_income,profile_headline,profile_about_me,
profile_like_to_meet,profile_interest,profile_music,profile_television,profile_books,profile_heroes,profile_here_for,profile_counter FROM users WHERE user_id=1 AND user_role >
Run Code Online (Sandbox Code Playgroud)
因此,如果没有进行大量测试,也许有经验丰富的人可以提出一些建议吗?
这会更糟吗?
SELECT * FROM users WHERE user_id=1 AND user_role >
Run Code Online (Sandbox Code Playgroud)
我更喜欢列出所有项目,因为在那个页面上,如果我需要来自数据库的东西,但是如果它会更快,我就不会列出它们,这很容易看到我可以使用的东西.
我正在尝试使用SqlBulkCopy将一堆数据导入我们的网站.在大多数其他领域,我们使用的是Entity模型,它使用字节数组来表示SQL中的二进制数据.但是,SqlBulkCopy似乎使byte []与字符串混淆.除了抛出异常的一个二进制列之外,一切似乎都工作正常:"数据源中String类型的给定值无法转换为指定目标列的二进制类型."
我创建了一个小测试用例来说明问题:
using System.Data;
using System.Data.SqlClient;
namespace SqlBulkCopyTest
{
class Program
{
static void Main(string[] args)
{
DataTable table = new DataTable("BinaryData");
table.Columns.Add("Data");
for (int i = 0; i < 10; i++)
{
var row = table.NewRow();
row["Data"] = new byte[5] { 1, 2, 3, 4, 5 };
table.Rows.Add(row);
}
using (var connection =
new SqlConnection("Data Source=localhost\\sqlexpress;Initial Catalog=TestBulkCopy;Integrated Security=True"))
{
connection.Open();
using (var copier = new SqlBulkCopy(connection))
{
copier.DestinationTableName = table.TableName;
/* EXCEPTION HERE: */ copier.WriteToServer(table);
}
}
} …Run Code Online (Sandbox Code Playgroud) 使用Oracle 10g db我有一个像这样的表:
create table x(
ID NUMBER(10) primary key,
wedding DATE NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我怎么能够
select * from x where wedding is in june 2008???
Run Code Online (Sandbox Code Playgroud)
我知道这可能很容易,但到目前为止我找不到任何令人满意的答案.非常感谢帮助.
Reading that
how to do hibernate mapping for table or view without a primary key
I am wondering how to add a primary key to my view as it is basically just a stored query...?
PS: oracle 10g
thx
我正在试图找到一种方法来加速一个特别麻烦的查询,该查询在几个表中按日期聚合一些数据.下面的完整(丑陋)查询以及EXPLAIN ANALYZE显示它有多可怕.
如果有人可以偷看,看看他们是否能发现任何重大问题(很可能,我不是Postgres的人),这将是一流的.
所以这里.查询是:
SELECT
to_char(p.period, 'DD/MM/YY') as period,
coalesce(o.value, 0) AS outbound,
coalesce(i.value, 0) AS inbound
FROM (
SELECT
date '2009-10-01' + s.day
AS period
FROM generate_series(0, date '2009-10-31' - date '2009-10-01') AS s(day)
) AS p
LEFT OUTER JOIN(
SELECT
SUM(b.body_size) AS value,
b.body_time::date AS period
FROM body AS b
LEFT JOIN
envelope e ON e.message_id = b.message_id
WHERE
e.envelope_command = 1
AND b.body_time BETWEEN '2009-10-01'
AND (date '2009-10-31' + INTERVAL '1 DAY')
GROUP BY period …Run Code Online (Sandbox Code Playgroud) 在TSQL中有没有办法做这样的事情:
select a,b,c,
case
when a=1 then 5
when a=2 then 6
end as d
from some_table
where d=6
Run Code Online (Sandbox Code Playgroud)
实际的case语句真的很复杂,所以我试图避免在where子句中重复它?这有什么窍门吗?
(我认为在MySQL中使用"有d = 6"的技巧).
sql ×10
database ×3
mysql ×3
c# ×2
oracle ×2
postgresql ×2
.net ×1
activerecord ×1
case ×1
date ×1
join ×1
left-join ×1
optimization ×1
oracle10g ×1
php ×1
plsql ×1
primary-key ×1
sql-server ×1
t-sql ×1
view ×1