相关疑难解决方法(0)

sql join语法

我是一个新的编写SQL,我有一个关于连接的问题.这是一个选择示例:

select bb.name from big_box bb, middle_box mb, little_box lb
where lb.color = 'green' and lb.parent_box = mb and mb.parent_box = bb;
Run Code Online (Sandbox Code Playgroud)

所以我要说的是,我正在寻找所有大盒子的名字,这些盒子里面嵌套着一个绿色的小盒子.如果我理解正确,上面的语法是通过使用'join'关键字获得相同结果的另一种方法.

问题:上面的select语句是否对它正在进行的任务有效?如果没有,有什么更好的方法呢?是连接的语句语法糖还是实际上正在做其他事情?

如果你有关于这个主题的任何好材料的链接,我很乐意阅读它,但由于我不知道究竟是什么称这种技术,我在谷歌上搜索它有困难.

sql syntax join

4
推荐指数
1
解决办法
1万
查看次数

有人可以帮助解释为什么不使用SQL JOIN是不好的做法和错误?

可能重复:
显式vs隐式SQL连接
SQL JOIN:USING,ON或WHERE之间有区别吗?

我正在查看由不熟悉SQL的开发人员维护的代码.我在他的代码中经常看到以下代码片段:

SELECT *
FROM person, status
WHERE person.status_id = status.id
Run Code Online (Sandbox Code Playgroud)

我已向他建议他使用以下代码:

SELECT *
FROM person
INNER JOIN status ON status.id = person.status_id
Run Code Online (Sandbox Code Playgroud)

他指出,在这种特殊情况下,两个查询在相同的时间范围内返回相同的结果(67毫秒中的34k行).我的新查询在这种情况下没有改变任何事实这一事实证明了这种方法没有任何问题.我曾尝试向他解释笛卡尔等产品,但他坚持认为这种方法没有任何问题.有人可以帮助提供负面的例子,说明依赖于此的方法会失败,和/或为什么从实施的角度来看这种查询行是危险的?

mysql sql join

4
推荐指数
1
解决办法
1041
查看次数

如何包含缺少一半联接的记录?

假设我有这样的查询:

SELECT 
    s.staffID as staffID, 
    CONCAT_WS(", ", lname, fname) AS name, 
    GROUP_CONCAT(unit SEPARATOR ", ") AS units 
FROM 
    staff s, 
    units u, 
    staff_units r 
WHERE 
    s.staffID = r.staffID 
    AND u.unitID = r.unitID 
GROUP BY s.staffID 
ORDER BY lname
Run Code Online (Sandbox Code Playgroud)

这得到一个这样的列表:

Alice    Accounting
Bob      Systems
Charlie  Customer Services, Administration
Run Code Online (Sandbox Code Playgroud)

好的,到目前为止.现在假设我删除了staff_units记录Alice作为Accounting成员的条目.然后,运行此查询将生成一个列表,从中排除Alice,即使她仍然存在于staff表中:

Bob      Systems
Charlie  Customer Services, Administration
Run Code Online (Sandbox Code Playgroud)

我可以调整这个SQL,以便它继续返回Alice,结果显示她未分配给一个单元吗?

我当然可以运行一个查询来获取人员列表,并为每个人员查询另一个查询以获取当前分配.但这意味着要运行n + 1个查询来构建列表,其中n是人员数量,这只是让我错了.

mysql sql

4
推荐指数
1
解决办法
55
查看次数

我可以在没有CURSOR的情况下编写此查询吗?

我试图找出在同一类别的另一个表中找到的时间戳的阈值时间内发生的事件数.改变delta的最快方法是什么(在下面给出的情况下,delta是5分钟)?我刚刚使用游标测试了一种方法(将变量设置为5,然后继续递增并执行相同的查询),但每次迭代需要10秒.在我的实际数据中,#EVENTS中的行数大约等于100K,而#CHANGES大约是500K.

我的表格如下:

CREATE TABLE #EVENTS(Category varchar(20), Timestamp datetime)
GO

INSERT INTO #EVENTS VALUES('A', '2013-01-23 05:02:00.000')
INSERT INTO #EVENTS VALUES('A', '2013-01-23 05:04:00.000')
INSERT INTO #EVENTS VALUES('B', '2013-01-23 05:03:00.000')
INSERT INTO #EVENTS VALUES('B', '2013-01-21 05:02:00.000')
GO

CREATE TABLE #CHANGES(Category varchar(10), Timestamp datetime)
GO

INSERT INTO #CHANGES VALUES('A', '2013-01-23 05:00:00.000')
INSERT INTO #CHANGES VALUES('B', '2013-01-21 05:05:00.000')

SELECT *
FROM
(
    SELECT X.Category, X.Timestamp, Y.Timestamp BeforeT, DATEADD(MINUTE, 5, Y.Timestamp) AfterT
    FROM #EVENTS X, #CHANGES Y
    WHERE X.Category = Y.Category
) X
WHERE X.Timestamp BETWEEN …
Run Code Online (Sandbox Code Playgroud)

sql sql-server query-optimization sql-server-2008

3
推荐指数
1
解决办法
91
查看次数

使用INNER JOIN打印mySQL查询的结果

我有一个工作的SQL语句,当我在MAMP上检查它时返回了正确的结果.

SELECT `questions`.`questionID` AS question, `questions`.`questionText`, 
       `questions`.`categoryID`,`answers`.`answerID`,`answers`.`answerText`,
       `answers`.`isTrue`
FROM `questions`,`answers`
WHERE `questions`.`questionID` = `answers`.`questionID`
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何用PHP打印输出.请帮忙.这是代码:

<html>
<body>

<?php
    header('Content-Type: text/html; charset=utf-8');
    $con=mysqli_connect("localhost","root","root","Theory");
    // Check connection
    if (mysqli_connect_errno())
    {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }
    $result = mysqli_query($con,"SELECT `questions`.`questionID` AS question, `questions`.`questionText`, `questions`   .`categoryID`, `answers`.`answerID`,`answers`.`answerText`,`answers`.`isTrue`
                                 FROM `questions`,`answers`
                                 WHERE `questions`.`questionID` = `answers`.`questionID`");

    if (!$result)
    {
        die('Error: ' . mysqli_error($con));
    }
   while($row = mysqli_fetch_array($result))
   {
       echo "{";
       echo "{" . $row['questions'.'questionID'] . "}";   //this is not the full print …
Run Code Online (Sandbox Code Playgroud)

php mysql

3
推荐指数
2
解决办法
1315
查看次数

SQL选择匹配记录存在的位置,没有匹配的记录

我需要交叉引用2个表.

在tb1内是booking_ref,投资者

在tb2内是booking_ref,投资者,成本

问题是如果没有成本,表2中没有创建记录

所以我有以下查询......

SELECT 
  tb1.booking_ref, tb1.investor, tb2.cost 
FROM 
  tb1, tb2 
WHERE 
  tb1.booking_ref = tb2.booking_ref 
AND 
  tb1.investor = tb2.investor 
AND 
  tb1.investor = ''12345''
Run Code Online (Sandbox Code Playgroud)

这显示了tb2中匹配的booking_ref的所有预订,但我还需要显示没有匹配的booking_ref的预订

有任何想法吗??

sql sql-server

2
推荐指数
1
解决办法
948
查看次数

隐式/显式连接有什么区别?

可能重复:
显式vs隐式SQL连接

我知道现在很多人会对我大喊大叫.但是从我的理解

说我有两张桌子

学生们

student_id
firstname
surname
Run Code Online (Sandbox Code Playgroud)

课程

course_id
name
student_id
Run Code Online (Sandbox Code Playgroud)

所以课程表有一个外键STUDENT_ID意味着一个学生可以拥有多个课程吗?

好的.

根据我的理解,如果我想选择与一名学生相关的所有课程,我可以做以下任何一项:

SELECT * 
FROM courses AS c, students AS s 
WHERE c.student_id = s.student_id 
  AND s.student_id = 1;
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * 
FROM courses AS c 
   JOIN students AS s ON c.student_id = s.student_id AND s.student_id = 1;
Run Code Online (Sandbox Code Playgroud)

那么当它与WHERE基本上完全相同时,JOIN的重点是什么?

我知道我的理解是错的,但我找不到简单的答案.

请赐教!

sql

2
推荐指数
1
解决办法
4777
查看次数

为什么CROSS JOIN条件在“ ON”子句中不起作用,仅在WHERE子句中起作用?

我想知道为什么条件交叉联接必须具有WHERE子句中指定的条件,以及为什么它在'ON'子句中不起作用。请参阅编译示例的链接:http : //rextester.com/IKY8693

业务环境:我需要生成一个开始日期和结束日期之间的日期列表,以填补空白,以便与第三张表保持连接,以便在特定月份返回零/空值。

我是如何做到的:让我们以一个带有YYYYMM开始和结束日期的用户表为例。

| user_id | start_yearmonth | end_yearmonth |
|---------|-----------------|---------------|
| u9876   | 201504          | 201610        |
| u5564   | 201602          | 201612        |
| u4435   | 201606          | NULL          |
Run Code Online (Sandbox Code Playgroud)

要交叉连接的表是所需的YYYYMM日期的表。

| yearmonth |
|-----------|
| 201601    |
| 201602    |
| 201603    |
| 201604    |
| 201605    |
| 201606    |
| 201607    |
| 201608    |
| 201609    |
| 201610    |
| 201611    |
| 201612    |
| 201701    | …
Run Code Online (Sandbox Code Playgroud)

postgresql cross-join

2
推荐指数
1
解决办法
3428
查看次数

在Delphi中过滤MySQL结果

我对我的一项家庭作业有一定的要求.我需要列出学生名单,并打印所有学生,学分为12或以上.学分小时存储在一个单独的表中,基本上通过第三个表引用,学生表,带小时的班级表,以及将学生ID与课程ID匹配的登记表

我使用了从表中按名字分组的SUM聚合,并且一切都很好,但我不太清楚如何过滤掉不到12小时的人,因为SQL不知道每个人有多少小时直到完成查询为止.

我的字符串看起来像这样


'SELECT Students.Fname, SUM(Classes.Crhrs) AS Credits 
FROM Students, Classes, Enrolled 
WHERE Students.ID = Enrolled.StudentID AND Classes.ID = Enrolled.CourseID 
GROUP BY Students.Fname;'
Run Code Online (Sandbox Code Playgroud)

它工作正常,并在Delphi项目中显示网格,但我不知道从这里过滤结果,因为每个查询运行删除前一个.

mysql database delphi

1
推荐指数
1
解决办法
884
查看次数

INNER JOIN和,COMMA之间的区别

我在下面的两个查询和相同的执行计划中都得到相同的结果,有什么区别吗?还是我更喜欢写查询?

SELECT PS.StepID,PR.ProgramID FROM ProgramSteps PS, Programs PR
WHERE PS.ProgramID = PR.ProgramID

SELECT PS.StepID,PR.ProgramID FROM ProgramSteps PS
INNER JOIN Programs PR ON PS.ProgramID = PR.ProgramID
Run Code Online (Sandbox Code Playgroud)

sql

1
推荐指数
1
解决办法
1043
查看次数

'on子句'中的未知列'xxx'

我有一个SQL查询,如下所示:

SELECT 
    a.id user_id, a.type, a.email_address, 
    a.name_first, a.name_last, languages.title as language,
    b.created_at purchased_on, b.expires_at watchable_until,
    c.title,
    d.title topic,
    e.title category,
    f.subject, f.grade
FROM users a,
     user_video_purchases b,
     videos c,
     gradesubject_category_topics d,
     gradesubject_categories e,
     gradesubjects f
JOIN languages ON 
          users.language_preferred_id = languages.id
WHERE a.id = b.user_id
      AND b.video_id = c.id
      AND c.gradesubject_category_topic_id = d.id
      AND d.gradesubject_category_id = e.id
      AND e.gradesubject_id = f.id
ORDER BY purchased_on DESC;
Run Code Online (Sandbox Code Playgroud)

此查询返回以下错误消息:

'on子句'中的未知列'users.language_preferred_id'

这些列存在于users表中,据我所知JOIN是正确的.

有人可以指出我可能出错的地方吗?

mysql sql database

1
推荐指数
1
解决办法
263
查看次数

你如何在SQL中选择一个确切的日期?

select o.customerid, c.customername, o.orderdate
from orders as o, customers as c
where o.orderdate='1997-08-26';
Run Code Online (Sandbox Code Playgroud)

使用示例northwind db,我无法弄清楚出了什么问题?我使用了样本表中使用的日期格式.

我正在尝试提取26日下订单的任何人的ID和姓名.

sql sql-server date

-1
推荐指数
1
解决办法
3235
查看次数

在SQL中使用WHERE

我不明白下面给出的两种编码之间的区别.第一个用于WHERELEFT JOIN.第二个代码使用AND.我不明白从每个编码中得到的输出是什么?

SELECT c.FirstName, c.LastName, oh.SalesOrderNumber
FROM SalesLT.Customer AS c
LEFT OUTER JOIN SalesLT.SalesOrderHeader AS oh
ON c.CustomerID = oh.CustomerID 
WHERE oh.SalesOrderNumber IS NULL 
ORDER BY c.CustomerID;


SELECT c.FirstName, c.LastName, oh.SalesOrderNumber
FROM SalesLT.Customer AS c
LEFT OUTER JOIN SalesLT.SalesOrderHeader AS oh
ON c.CustomerID = oh.CustomerID  
AND oh.SalesOrderNumber IS NULL 
ORDER BY c.CustomerID;
Run Code Online (Sandbox Code Playgroud)

sql t-sql left-join

-2
推荐指数
1
解决办法
113
查看次数